Примитивные типы Typescript: любая разница между типами "number" и "Number" (без учета регистра TSC)?

Я хотел написать параметр типа number, но я неправильно указал тип, пишет .

на моей IDE (JetBrains WebStorm) тип Number пишется тем же цветом, который используется для примитивного типа number, в то время как если я пишу имя класса (известного или неизвестного), он использует другой цвет, поэтому я предполагаю, что каким-то образом он распознает тип с ошибкой как правильный/почти правильный/вид правильного типа.

когда я компилирую код, вместо этого например, жалобы на то, что компилятор не смог найти класс с именем Number, TSC пишет это сообщение об ошибке:

Illegal property access

значит number и Number оба сосуществуют как разные типы?

если это правда, в чем разница между этими классами?

если это не так, то почему он просто не написал то же сообщение об ошибке, которое он отображает для неизвестных классов ("имя " номер" не существует в текущем scope")

этот код:

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]; 
    }
}

2 ответов


JavaScript имеет понятие первобытное типы (число, строка и т. д.) и объект типы (число, строка, и т. д., которые проявляются во время выполнения). TypeScript types number и Number относятся к ним соответственно. JavaScript обычно принуждает тип объекта к его примитивному эквиваленту или наоборот:

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

системные правила типа TypeScript имеют дело с этим (раздел 3.7 спецификации) следующим образом:

для целей определение подтипа, супертипа и назначения отношения совместимости, число, логический и строковый примитив типы рассматриваются как типы объектов с теми же свойствами, что Интерфейсы "Number", "Boolean" и "String" соответственно.


чтобы дополнить ответ Райана руководством от машинопись делать и чего не делать:

никогда не используйте типы Number, String, Boolean или Object. Эти типы относятся к непримитивным коробочным объектам, которые почти никогда не используются должным образом в коде JavaScript.

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

используйте типы number, string и boolean.

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