typescript - 你如何声明一个值约束类型?
问题描述
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 };
解决方案
你不能,至少从 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");
}
不太好。哦,好吧,希望有帮助;祝你好运!
推荐阅读
- android - 在 Android Studio 中更改 Gitlab 帐户
- python - 在 python 中创建环境对象
- c++ - 在 C++ 中的链表末尾插入一个节点
- javascript - 输入带逗号的文本字段
- mysql - 在 Mysql/Mariadb 中删除 --temporary-- 索引
- python - django查询集中两个日期之间的差异
- python - 从 BME680 捕获博世 BSEC 输出
- php - SQLite fetch 在列为空时返回 null 但我需要它在列为空时返回 ""
- c++ - c++ Queue Pop():抛出异常:读取访问冲突。m 是 nullptr
- android - 如何在片段和对话框片段的 ViewModel 中使用相同的 mutableLiveData