如果我定义以下类型:
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/