typescript官网 - typescript教程




如何指定类属性是整数? (4)

我正在尝试使用TypeScript,并且在创建一个带有“ID”字段且应该是整数的类的过程中,我有点困惑。

首先,在带有TypeScript插件的Visual Studio 2012中,我在intelliSense类型列表中看到“int”。 但我得到一个编译错误,说“当前范围中不存在名称'int'”。

我查看了语言规范,只看到以下原始类型:number,string,boolean,null和undefined。 没有整数类型。

所以,我有两个问题:

  1. 我应该如何向我的班级用户表明某个特定字段不仅仅是一个“数字”而是一个整数(从不是浮点数或十进制数)?

  2. 如果它不是有效类型,为什么我会在intellisense列表中看到“int”?

更新:到目前为止我得到的所有答案都是关于JavaScript如何没有int类型,在运行时很难强制执行int类型...我知道这一切。 我问是否有一种TypeScript方式为我的类的用户提供一个注释,该字段应该是一个整数。 也许某些特定格式的评论?


  1. 我认为没有直接的方法来指定数字是整数还是浮点数。 在TypeScript规范第3.2.1节中,我们可以看到:

    “... Number原语类型对应于类似命名的JavaScript原语类型,表示双精度64位格式IEEE 754浮点值......”

  2. 我认为int是Visual Studio intelliSense中的一个错误。 正确的是number


TypeScript是JavaScript的超集,它没有int的概念。 它只有一个数字的概念,它有一个浮点。

从哲学上讲,编译器必须做的工作量只能强制执行TypeScript int类型的整数,这可能会很大,在某些情况下,仍然无法确保在编译时只分配整数,这就是为什么不可能将int可靠地添加到TypeScript中的原因。

当您最初在Visual Studio中获得intelliSense时,工具无法确定要提供的内容,因此您可以获得所有内容,包括int - 但是一旦处理了某种已知类型的内容,您就会获得明智的智能感知。

例子

var myInt: number;
var myString: string;

myInt. // toExponential, toFixed, toPrecision, toString
myString. // charAt, charCodeAt, concat, indexOf, lastIndexOf, length and many more...

在TypeScript中,您可以使用标记来近似有时称为opaque类型的内容。

// Helper for generating Opaque types.
type Opaque<T, K> = T & { __opaque__: K };

// 2 opaque types created with the helper
type Int = Opaque<number, 'Int'>;
type ID = Opaque<number, 'ID'>;

// using our types to differentiate our properties even at runtime
// they are still just numbers
class Foo {
    someId: ID;
    someInt: Int;
}

let foo = new Foo();

// compiler won't let you do this due to or markers
foo.someId = 2;
foo.someInt = 1;

// when assigning, you have to cast to the specific type
// NOTE: This is not completely type safe as you can trick the compiler 
// with something like foo.someId = 1.45 as ID and it won't complain.
foo.someId = 2 as ID;
foo.someInt = 1 as Int;

// you can still consume as numbers
let sum: number = foo.someId + foo.someInt;

这样做可以让您在代码中更明确地了解属性所期望的类型,并且编译器不允许您在没有强制转换的情况下分配原始值。 这不会产生任何额外的.js输出,您仍然可以使用和使用它们所基于的任何类型的值。 在这个例子中,我使用数字,但你也可以使用字符串和其他类型。

在这个例子中,您仍然可以欺骗编译器接受不是Int或Id的东西,但是如果你试图将1.45分配为Int或类似的东西,它应该跳出来。 您还可以选择创建辅助函数,用于创建值以提供运行时验证。

您可以通过多种不同的方式创建“标记”类型。 这是一篇很好的文章: https://michalzalecki.com/nominal-typing-in-typescript/https://michalzalecki.com/nominal-typing-in-typescript/


好吧,正如你所看到的,typescript没有浮动数据类型,如javascript语言。 只有同时覆盖所有intdoublenumber ; 也许你必须创建一个带有数字的函数,并检查它是否是intdouble ,通过返回一些状态以防错误/成功。 像这样的方法是你班级的方法:

function SetN(x:number) {
   var is_int = parseInt(x) === parseFloat(x);
   if(is_int) this.n = x;
   return is_int;
}

//..
y = 10.5;
if(SetN(y)) {
  //OK
} else {
   //error not set y isn't a int
}

注意:它不适用于10.0例如,如果你不想要它,也许你必须将它转换为字符串并尝试找到一个.





typescript