types - 有没有办法在 typescript 中定义一个新的(而不是别名)类型?

标签 types typescript

如果我定义以下类型:

type seconds = number;
type milliseconds = number;

类型只是别名,下面的语法不会引发任何错误:

var x:seconds = 1;
var y:milliseconds = x;

虽然我希望 typescript 能够防止在没有转换的情况下进行此类分配。有没有办法创建新的名义类型?

注意:我找到了 this proposal , 不确定此后是否有新发布。

最佳答案

我的回答可能是对@basarat 的回答的更好评论,但这样的评论太重了,所以无论如何我都会把它留在这里,因为你可能会发现它很方便。

此处还有另一个关于标称类型的相关提案:https://github.com/Microsoft/TypeScript/issues/202

在那次讨论中,Ryan Cavanaugh has suggested using Branded types大致了解您正在寻找的内容:

// Once
type Branded<T, U> = T & { '__ kind': U };

// Elsewhere
type OrderID = Branded<string, 'Order ID'>;

@basarat 的技巧很相似,但我无法让它与数字一起使用。

所以在你的情况下,它将是:

type Branded<T, U> = T & { '__ kind': U };

type Milliseconds = Branded<number, 'Milliseconds'>;
type Seconds = Branded<number, 'Seconds'>;

let secondsValue: Seconds = <Seconds>5;
let millisecondsValue: Milliseconds = <Milliseconds>5;

secondsValue = millisecondsValue; // Error, just as you want

secondsValue = <Seconds>(secondsValue + secondsValue); // Works
secondsValue = secondsValue + secondsValue; // Doesn't work :(
secondsValue = <Seconds>(secondsValue + millisecondsValue); // Also works :(

Playground link 因此,它并不完美,但您至少必须有意识地为彼此分配任意数字,这比使用类型别名更好。

关于types - 有没有办法在 typescript 中定义一个新的(而不是别名)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657930/

相关文章:

angular - NgRx 通过 dispatch 方法传递 payload 来更新 store

c# - 将简单对象转换为简单通用的接口(interface)

java - 存储二进制路径的最有效方法(例如通过二叉树)

javascript - 隐藏在抽屉导航器后面的内容

reactjs - 仅当 React 中的状态发生变化时才更改变量值

angular - 即使我不保存更改,Visual Studio Code 也会继续编译

math - OCaml 中的类型级算术

typescript - 回调参数的条件类型

java - 其元素的通用实例化的 Java 数组的包装器类

javascript - 削减 JSON 对象以声明方式发送到 Typescript 中的客户端?