首页 > 解决方案 > 你如何声明一个值约束类型?

问题描述

艾达

type Year_type is range 1800 .. 2100;

subset Natural of Int where * ≥ 0;

卡沃尔卡

Int $even where { $_ % 2 == 0 }

TS

type Natural = BigInteger /* hypothetical → */ where (n) => { return n >= 0 };

标签: typescript

解决方案


你不能,至少从 TS3.8 开始。

有一个开放的建议,microsoft/TypeScript#15480来支持范围数值类型;如果您想看到这种情况发生,您可能想解决那个问题,给它一个 ,如果您认为它特别引人注目并且尚未考虑到,也许可以描述您的用例。

对于您的一个示例中的“偶数”类型,您完全需要其他东西;可能作为先决条件,您需要编译器能够在类型级别执行算术,而它目前不这样做。像往常一样,有一个现有的未解决问题microsoft/TypeScript#26382,但我不知道这是否会严重发生。依赖类型很棒,但我不知道它们是否会很快在语言中发生。

在那之前,你能做的最好的事情就是创建一个类似名义的类型和一个用户定义的类型保护,以允许值是正确的类型。但所做的只是迫​​使开发人员每次想要使用您的受约束类型时执行一堆运行时测试,因为编译器无法强制或检查它:

type EvenNumber = number & { ___isEven: true };

function isEven(x: number): x is EvenNumber {
  return x % 2 == 0;
}

function divideByTwoEvenly(x: EvenNumber): number {
  return x / 2;
}

const a = divideByTwoEvenly(100); // error! 100 is not an EvenNumber
const hundred = 100;
if (isEven(hundred)) {
  const a = divideByTwoEvenly(hundred);
} else {
  throw new Error("I'm SAD");
}

不太好。哦,好吧,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读