Typescript原始类型:类型“number”和“Number”之间有区别吗?(TSC是否不区分大小写?)

157

我原本想写一个number类型的参数,但我拼错了单词,写成了Number

在我的IDE(JetBrains WebStorm)中,Number这个类型所使用的颜色与原始类型number所使用的颜色相同,而如果我写一个类名(已知或未知),它会使用不同的颜色。因此,我猜测它以某种方式将错误拼写的类型识别为正确/几乎正确/差不多正确的类型。

当我编译代码时,TSC并没有抱怨找不到名为Number的类,而是写了这个错误消息:

Illegal property access

这是否意味着numberNumber同时存在于不同的类型中?

如果是这样,这两个类之间有什么区别?

如果不是这种情况,那么为什么它没有像对于未知类一样显示相同的错误消息(“当前范围中不存在名称'Number'”)?

这是代码:

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个回答

194

根据TypeScript Do's and Don'ts的指导,进一步补充Ryan的答案:

千万别使用类型NumberStringBooleanSymbolObject。这些类型是指非基元包装对象,几乎从不适当地用于JavaScript代码中。

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

建议使用类型numberstringbooleansymbol

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

2
@atilkan 真有趣。我猜他们没有采纳自己的建议。 - Shaun Luttin
2
那份文档是在小写的 object 出现之前编写的。 - Ryan Cavanaugh
3
关于数组,我找不到任何小写字母的例子。 - atilkan
3
你应该使用 [] 表示数组类型。虽然可能有例外,但我不确定。 - Victor Zamanian
1
@VictorZamanian 这里有一个很好的解释 -> https://toddmotto.com/typing-arrays-typescript - atilkan
显示剩余7条评论

78

JavaScript有原始类型(数字、字符串等)和对象类型(Number、String等,这些在运行时体现)的概念。TypeScript类型numberNumber分别指它们。JavaScript通常会将对象类型强制转换为其原始等效类型,反之亦然:

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

TypeScript类型系统的规则(规范第3.7节)如下处理:
为了确定子类型、超类型和赋值兼容关系,数字、布尔和字符串原始类型被视为具有与相应的“Number”、“Boolean”和“String”接口相同的属性的对象类型。

8
可以补充一点,它们并不完全可交换:http://www.typescriptlang.org/Playground/#src=var%20x%3Anumber%3B%0Avar%20y%3ANumber%3B%0Ay%20%3D%20x%3B%20%2F%2F%20可以%0Ax%20%3D%20y%3B%20%2F%2F%20不可以 - basarat
7
回答原帖的问题:是的,TSC(像JavaScript一样)区分大小写 :) - basarat

3
正如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');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接