Typescript原语类型:“number”和“Number”类型之间的任何区别(TSC不区分大小写)?

时间:2013-03-18 21:24:03

标签: typescript tsc

我的意思是写一个number类型的参数,但是拼错了类型,而是编写了Number

在我的IDE(JetBrains WebStorm)上,类型Number的编写方式与用于基本类型number的颜色相同,而如果我写了一个类的名称(已知或未知)它使用不同的颜色,所以我猜它以某种方式将拼写错误的类型识别为正确/几乎正确/排序正确的类型。

当我编译代码时,而不是抱怨例如编译器找不到名为Number的类,TSC写入此错误消息:

Illegal property access

这是否意味着numberNumber共存为不同的类型?

如果这是真的,这些类之间的区别是什么?

如果不是这种情况,那么为什么它只是没有写出它为未知类显示的相同错误消息(“当前范围中不存在名称'数字'”)

这是代码:

class Test
{
    private myArray:string[] = ["Jack", "Jill", "John", "Joe", "Jeff"];

    // THIS WORKS
    public getValue(index:number):string
    {
        return this.myArray[index];
    }

    // THIS DOESN'T WORK: ILLEGAL PROPERTY ACCESS
    public getAnotherValue(index:Number):string
    {
        return this.myArray[index]; 
    }
}

3 个答案:

答案 0 :(得分:67)

TypeScript Do's and Don'ts的指导下增加Ryan的答案:

  

不要使用Number,String,Boolean或Object类型。这些类型是指在JavaScript代码中几乎从不使用的非原始盒装对象。

/* WRONG */
function reverse(s: String): String;
     

请使用类型number,string和boolean。

/* OK */
function reverse(s: string): string;

答案 1 :(得分:34)

JavaScript具有原始类型(数字,字符串等)和对象类型(数字,字符串等,在运行时显示)的概念。 TypeScript类型numberNumber分别引用它们。 JavaScript通常会将对象类型强制转换为其原始等价物,反之亦然:

var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35

TypeScript类型系统规则处理这个(规范部分3.7),如下所示:

  

用于确定子类型,超类型和赋值   兼容性关系,Number,Boolean和String原语   类型被视为具有与之相同属性的对象类型   分别为'Number','Boolean'和'String'接口。

答案 2 :(得分:1)

如TypeScript文档所述:

var Number: NumberConstructor
(value?: any) => number

一个对象,代表各种类型的数字。所有JavaScript编号 是64位浮点数。

如前所述,将any作为参数并返回数字或null

它提供了一种简单的方法来检查值是否为数字

Number("1234");   // 1234
Number("1234.54") // 1234.54
Number("-1234.54") // -1234.54
Number("1234.54.33") // null
Number("any-non-numeric") // null

所以我们可以简单地使用它来检查电话号码,例如:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}