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
}
如果要强制编译器将
数字
接受为
有效值
,可以使用:

这有用吗?祝你好运