Примітивні типи машинопису: чи є різниця між типами “число” та “число” (чи не чутливий до регістру TSC)?


91

Я мав намір написати параметр type number, але я неправильно написав тип, Numberзамість цього написавши .

У моїй IDE (JetBrains WebStorm) тип Numberпишеться з тим самим кольором, який використовується для примітивного типу number, тоді як, якщо я пишу ім'я класу (відомого чи невідомого), він використовує інший колір, тому я думаю, що якимось чином він розпізнає неправильно написаний тип як правильний / майже правильний / тип сортування.

Коли я компілюю код, замість того, щоб скаржитися, наприклад, що компілятор не зміг знайти клас з іменем Number, TSC пише таке повідомлення про помилку:

Illegal property access

Чи означає це , що numberі 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]; 
    }
}

Відповіді:


57

JavaScript має поняття примітивних типів (число, рядок тощо) та типів об'єктів (Number, String тощо), які проявляються під час виконання. Типи TypeScript numberта Numberпосилання на них відповідно. JavaScript зазвичай примушує тип об’єкта до його примітивного еквівалента, або навпаки:

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

Системні правила типу TypeScript розглядають це (специфікація розділу 3.7) так:

Для цілей визначення відносин сумісності підтипів, супертипів та присвоєнь примітивні типи Number, Boolean та String розглядаються як типи об’єктів з тими ж властивостями, що і інтерфейси 'Number', 'Boolean' та 'String' відповідно.


8
Можна було б додати , що вони не зовсім крос призначаються: typescriptlang.org/Playground / ...
basarat

5
Також відповісти на оригінальний плакат: Так, TSC (наприклад, javascript) чутливий регістр :)
Басарат,

115

Щоб доповнити відповідь Райана вказівками з TypeScript Do and Donts :

Чи не коли - або використовувати типи Number, String, Boolean, Symbol, або Objectці типи відносяться до непрімітівним штучним об'єктам , які майже ніколи не використовуються належним чином в коді JavaScript.

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

Як використовувати типи number, string, boolean, і symbol.

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

2
@atilkan Це весело. Думаю, вони не беруть власної поради.
Шон Луттін,

1
@RyanCavanaugh Думаю, ми повинні повідомити про це.
атілкан

3
@ShaunLuttin Що стосується масиву, я не можу знайти жодного прикладу з малої літери.
atilkan

3
@atilkan Ви, мабуть, повинні використовувати []для позначення типів масивів. Однак можуть бути винятки, я не впевнений.
Віктор Заманян

1
@VictorZamanian Тут є гарне пояснення -> toddmotto.com/typing-arrays-typescript
atilkan

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');
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.