Typescript 我可以将类型限制为接口的值吗?
以下是我想要的:Typescript 我可以将类型限制为接口的值吗?,typescript,typescript-typings,Typescript,Typescript Typings,以下是我想要的: 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并非不可能,因为它不能在编译时演示,我希望它出错 可能吗
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并非不可能,因为它不能在编译时演示,我希望它出错
可能吗
是的,我知道没有什么可以阻止用户构建自己的validValue实现,并将TOP或BOTTOM设置为3。在这种情况下,Javascript库给了我一个函数,并给了我一个对象,该对象充满了调用它所需的值,我试图在Typescript中键入它
可能的
否。不适用于接口:
interface ValidValues {
TOP: number;
BOTTOM: number;
}
任何接受有效值
中的值的东西都将接受任何数字
(如3
)
可能的
否。不适用于接口:
interface ValidValues {
TOP: number;
BOTTOM: number;
}
任何接受
ValidValue
中的值的东西都将接受任何number
(如3
)看起来您想要一个类型ValidValue
,它可以分配给number
,但不能从number
中分配。这是一个技巧,您将number
与包含“brand”属性的对象类型相交,这样编译器就可以区分普通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
}
如果要强制编译器将数字
接受为有效值
,可以使用:
这有用吗?祝你好运
看起来您想要一个类型
ValidValue
,它可以分配给number
,但不能从number
分配。这是一个技巧,您将number
与包含“brand”属性的对象类型相交,这样编译器就可以区分普通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
}
如果要强制编译器将数字
接受为有效值
,可以使用:
这有用吗?祝你好运