这是我想要的:
interface ValidValues {
TOP: number;
BOTTOM: number;
}
function f(b: valuesof(ValidValues)) {
}
function g(valid: ValidValues) {
f(valid.TOP);
f(3); // should not compile
}
尽管3恰好等于valid.TOP或valid.BOTTOM并不是不可能的,因为它不能在编译时演示,我希望它能出错。
有可能吗?
是的,我知道没有什么能阻止用户在顶部或底部设置为3的情况下构建自己的ValidValues实现。在这种情况下,Javascript库给了我一个函数,并给了我一个充满值的对象来调用它,而我正试图在Typescript中键入它。
发布于 2019-06-05 08:41:29
看起来你想让像branded primitives这样的东西有一个ValidValue
类型,这个类型可以赋值给number
,但不能从number
赋值。这是一个技巧,您可以将number
与包含“品牌”属性的对象类型相交,以便编译器能够区分普通number
和品牌ValidValue
之间的区别,即使在运行时没有区别( ValidValue
在运行时不会真正具有品牌属性)。
如下所示:
type ValidValue = number & { __brand: "ValidValue" };
interface ValidValueObj {
TOP: ValidValue;
BOTTOM: ValidValue;
}
让我们看看它是如何工作的:
function f(b: ValidValue) {}
function g(valid: ValidValueObj) {
f(valid.TOP);
f(3); // error as desired
}
如果您想强制编译器接受number
作为ValidValue
,您可以使用type assertions
function getValidValueObj(top: number, bot: number): ValidValueObj {
return {
TOP: top as ValidValue,
BOTTOM: bot as ValidValue
};
}
这有帮助吗?祝好运!
https://stackoverflow.com/questions/56451295
复制相似问题