Typy pierwotne w maszynopisie: czy jest różnica między typami „liczba” i „liczba” (czy w TSC jest rozróżniana wielkość liter)?

91

Chciałem napisać parametr typu number, ale błędnie napisałem typ, pisząc Numberzamiast tego.

Na moim IDE (JetBrains WebStorm) typ Numberjest zapisany tym samym kolorem, który jest używany dla typu pierwotnego number, natomiast jeśli napiszę nazwę klasy (znanej lub nieznanej), używa innego koloru, więc domyślam się, że jakoś rozpoznaje błędnie napisany typ jako poprawny / prawie poprawny / rodzaj-poprawny.

Kiedy kompiluję kod, zamiast narzekać na przykład, że kompilator nie mógł znaleźć klasy o nazwie Number, TSC zapisuje następujący komunikat o błędzie:

Illegal property access

Czy to oznacza, że numberi Numberoba współistnieją jako różne typy?

Jeśli to prawda, jaka jest różnica między tymi klasami?

Jeśli tak nie jest, to dlaczego po prostu nie napisał tego samego komunikatu o błędzie, który wyświetla dla nieznanych klas („Nazwa„ Numer ”nie istnieje w bieżącym zakresie”)

To jest kod:

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]; 
    }
}
Cesco
źródło

Odpowiedzi:

57

JavaScript zawiera pojęcie typów pierwotnych (liczba, łańcuch itp.) I typów obiektów (liczba, łańcuch itp., Które są widoczne w czasie wykonywania). TypeScript numberi Numberodwołuj się do nich odpowiednio. JavaScript zwykle wymusza typ obiektu na jego prymitywny odpowiednik lub odwrotnie:

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

Reguły systemowe typu TypeScript radzą sobie z tym (sekcja specyfikacji 3.7) w następujący sposób:

W celu określenia relacji zgodności podtypów, nadtypów i przypisań, typy pierwotne Number, Boolean i String są traktowane jako typy obiektów o tych samych właściwościach, co odpowiednio interfejsy „Number”, „Boolean” i „String”.

Ryan Cavanaugh
źródło
8
Można by dodać, że nie są dokładnie krzyż cesji: typescriptlang.org/Playground/...
basarat
5
Aby odpowiedzieć również na oryginalny plakat: Tak, TSC (jak javascript) rozróżnia
wielkość
115

Aby uzupełnić odpowiedź Ryana o wskazówki z TypeScript :

Nie zawsze używać typów Number, String, Boolean, Symbol, lub Objecttypy te odnoszą się do innych niż prymitywnych pudełkowych obiektów, które są prawie nigdy nie stosowane odpowiednio w kodzie JavaScript.

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

Czy używać typów number, string, boolean, i symbol.

/* OK */
function reverse(s: string): string;
Shaun Luttin
źródło
2
@atilkan To zabawne. Myślę, że nie przyjmują własnych rad.
Shaun Luttin
1
@RyanCavanaugh Chyba powinniśmy to zgłosić.
atilkan
3
@ShaunLuttin A co z tablicą, nie mogę znaleźć żadnego przykładu z małymi literami.
atilkan
3
@atilkan Prawdopodobnie powinieneś używać []do oznaczania typów tablic. Mogą być jednak wyjątki, nie jestem pewien.
Victor Zamanian
1
@VictorZamanian Tutaj jest dobre wyjaśnienie -> toddmotto.com/typing-arrays-typescript
atilkan
1

Jak mówi dokument TypeScript:

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

Obiekt reprezentujący dowolną liczbę. Wszystkie liczby JavaScript są 64-bitowymi liczbami zmiennoprzecinkowymi.

Jak mówi, weź anyjako parametr i zwróć liczbę lubnull

Daje łatwy sposób sprawdzenia, czy wartość jest liczbą, czy nie

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

Po prostu możemy użyć do sprawdzenia numeru, na przykład:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Ali Adravi
źródło