Javascript typescript-创建表示偶数集的类型
有人知道如何创建这种类型吗? 如果“evenNumbers”是类型的名称,我希望例如:Javascript typescript-创建表示偶数集的类型,javascript,typescript,types,Javascript,Typescript,Types,有人知道如何创建这种类型吗? 如果“evenNumbers”是类型的名称,我希望例如: let a:evenNumbers = 3 将返回错误和 let a:evenNumbers = 4 不会 谢谢。您可以定义这样的类型,并从constructor()方法中抛出Error: export class EvenNumber{ value: number; constructor(value: number){ if(value % 2 != 0){ throw n
let a:evenNumbers = 3
将返回错误和
let a:evenNumbers = 4
不会
谢谢。您可以定义这样的类型,并从
constructor()
方法中抛出Error
:
export class EvenNumber{
value: number;
constructor(value: number){
if(value % 2 != 0){
throw new Error('not even');
}
this.value = value;
}
}
因为EvenNumber是一个自定义类型,所以应该使用构造函数来实例化它:
let a:EvenNumber = new EvenNumber(3);
您可以指定对于给定类型有效的数字 e、 g 这很好,但正如你所看到的,我已经指出了这种方法的问题 虽然10是偶数,但它仍然会出错,因为它没有被定义为
EvenNumber
类型的一部分
因此,您可以将EvenNumber
重新定义为type EvenNumber=2 | 4 | 6 | 8 | 10;
太好了!现在让baz:Even=10;可以了,但是让baz:Even=12;怎么样
因此,您必须找到一种方法,列出类型定义中的每个偶数。这可能最好使用一些代码生成工具,而不是手工
现在,我们有了一个只允许偶数的类型定义。不幸的是,它所在的文件现在必须非常大,这可能会给编译器和IDE带来问题
这能回答问题吗?是的
这在现实世界中真的可用吗?甚至不太接近。我很高兴被证明是错误的,但我觉得TypeScript的类型系统没有足够的功能来表达这一点。也许,可以在类型级别上编码一个版本的Peano数字,但是你的表达式看起来更像
let:evernumbers=s(s(Z)))
和让:evenNumbers=S(S(S(Z))),因为AFEK类型的文本不允许文字重载。是的,可能是不可能的,因为除了C++之外的其他原因,TS不提供泛型参数的算术。当我写偶数:EnnIt=2时,我得到了错误:类型“2”不可分配给“EnnEnter”类型。@ Guyb,因为<代码> 2 <代码>不能被分配给键入EvenNumber
,这是一个类。我没有想到这一点!非常聪明。我太习惯于使用带有实数的语言(即无限多的实数),以至于我完全忘记了TypeScript只有有限数量的整数,你可以将它们全部列出。酷!
type EvenNumber= 2 | 4 | 6 | 8;
let foo: EvenNumber= 8;
let bar: EvenNumber= 9; // ERROR: 9 isn't even
let baz: EvenNumber= 10; // ERROR: 10 is even, but it isn't defined as part of the Even type.