Typoskript-Primitivtypen: Gibt es einen Unterschied zwischen den Typen "Nummer" und "Nummer" (unterscheidet TSC nicht zwischen Groß- und Kleinschreibung)?

89

Ich wollte einen Parameter vom Typ schreiben number, aber ich habe den Typ falsch geschrieben und Numberstattdessen geschrieben.

In meiner IDE (JetBrains WebStorm) wird der Typ Numbermit derselben Farbe geschrieben, die für den primitiven Typ verwendet numberwird. Wenn ich einen Namen einer Klasse (bekannt oder unbekannt) schreibe, wird eine andere Farbe verwendet, sodass ich denke, dass er irgendwie erkannt wird Der falsch geschriebene Typ ist ein korrekter / fast korrekter / irgendwie korrekter Typ.

Wenn ich den Code kompiliere Number, schreibt TSC diese Fehlermeldung , anstatt sich beispielsweise zu beschweren, dass der Compiler keine Klasse mit dem Namen gefunden hat :

Illegal property access

Heißt das , dass numberund Numberbeide koexistiert als verschiedene Typen?

Wenn dies wahr ist, was ist der Unterschied zwischen diesen Klassen?

Wenn dies nicht der Fall ist, warum wurde dann nicht dieselbe Fehlermeldung geschrieben, die für unbekannte Klassen angezeigt wird ("Der Name 'Nummer' existiert im aktuellen Bereich nicht")

Dies ist der Code:

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
quelle

Antworten:

54

JavaScript hat den Begriff der primitiven Typen (Nummer, Zeichenfolge usw.) und Objekttypen (Nummer, Zeichenfolge usw., die sich zur Laufzeit manifestieren). TypeScript-Typen numberund Numberverweisen auf diese. JavaScript zwingt normalerweise einen Objekttyp zu seinem primitiven Äquivalent oder umgekehrt:

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

Die Systemregeln des TypeScript-Typs behandeln dies (Spezifikationsabschnitt 3.7) wie folgt:

Zum Bestimmen der Kompatibilitätsbeziehungen zwischen Subtyp, Supertyp und Zuweisung werden die primitiven Typen Number, Boolean und String als Objekttypen mit denselben Eigenschaften wie die Schnittstellen 'Number', 'Boolean' und 'String' behandelt.

Ryan Cavanaugh
quelle
8
Man könnte hinzufügen , dass sie nicht genau Quer zuordenbar: typescriptlang.org/Playground/...
basarat
5
Auch um das Originalplakat zu beantworten: Ja TSC (wie Javascript) unterscheidet zwischen Groß- und Kleinschreibung :)
Basarat
112

Um Ryans Antwort mit Hilfe der TypeScript Do's and Don'ts zu ergänzen :

Sie nicht immer die Typen verwenden Number, String, Boolean, Symbol, oder Objectbeziehen sich diese Typen nicht-primitive geschachtelte Objekte, die so gut wie nie in geeigneter Weise in JavaScript - Code verwendet.

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

Sie verwenden die Typen number, string, boolean, und symbol.

/* OK */
function reverse(s: string): string;
Shaun Luttin
quelle
2
@atilkan Das macht Spaß. Ich denke, sie nehmen ihren eigenen Rat nicht an.
Shaun Luttin
1
@ RyanCavanaugh Ich denke, wir sollten dies melden.
Localhoost
3
@ShaunLuttin Was ist mit Array, ich kann kein Beispiel für Kleinbuchstaben finden.
Localhoost
3
@atilkan Sie sollten wahrscheinlich verwenden [], um Array-Typen zu bezeichnen. Es könnte jedoch Ausnahmen geben, da bin ich mir nicht sicher.
Victor Zamanian
1
@ VictorZamanian Hier gibt es eine gute Erklärung -> toddmotto.com/typing-arrays-typescript
localhoost
1

Wie das TypeScript-Dokument sagt:

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

Ein Objekt, das eine beliebige Anzahl darstellt. Alle JavaScript-Zahlen sind 64-Bit-Gleitkommazahlen.

Nehmen Sie anyals Parameter und geben Sie die Nummer oder zurücknull

Es gibt eine einfache Möglichkeit zu überprüfen, ob ein Wert eine Zahl ist oder nicht

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

So können wir einfach die Nummer überprüfen, wie:

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