首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以将类型限制为接口的值?

是否可以将类型限制为接口的值?
EN

Stack Overflow用户
提问于 2019-06-05 05:00:13
回答 1查看 40关注 0票数 0

这是我想要的:

代码语言:javascript
复制
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中键入它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 08:41:29

看起来你想让像branded primitives这样的东西有一个ValidValue类型,这个类型可以赋值给number,但不能从number赋值。这是一个技巧,您可以将number与包含“品牌”属性的对象类型相交,以便编译器能够区分普通number和品牌ValidValue之间的区别,即使在运行时没有区别( ValidValue在运行时不会真正具有品牌属性)。

如下所示:

代码语言:javascript
复制
type ValidValue = number & { __brand: "ValidValue" };

interface ValidValueObj {
  TOP: ValidValue;
  BOTTOM: ValidValue;
}

让我们看看它是如何工作的:

代码语言:javascript
复制
function f(b: ValidValue) {}

function g(valid: ValidValueObj) {
  f(valid.TOP);
  f(3); // error as desired
}

如果您想强制编译器接受number作为ValidValue,您可以使用type assertions

代码语言:javascript
复制
function getValidValueObj(top: number, bot: number): ValidValueObj {
    return {
        TOP: top as ValidValue,
        BOTTOM: bot as ValidValue
    }; 
}

这有帮助吗?祝好运!

Link to code

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56451295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档