Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript typescript-创建表示偶数集的类型_Javascript_Typescript_Types - Fatal编程技术网

Javascript typescript-创建表示偶数集的类型

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

有人知道如何创建这种类型吗? 如果“evenNumbers”是类型的名称,我希望例如:

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.