TypeScript-Lernhinweise: Typeingrenzung

TypeScript-Lernhinweise: Typeingrenzung

Vorwort

Das Beste an TS ist die starke Typisierung, der eine Typverengung folgt. Ich werde es zusammenfassen, wenn ich schon dabei bin.

Typinferenz

In TypeScript hilft die Typinferenz dabei, Typen bereitzustellen, wo keine expliziten Typen vorhanden sind.

Beispiel:

let x = [0, 1, null] // Zahl

let x = Math.random() < 0,5 ? 100 : "HalloWort" // Zahl|Zeichenfolge

let x: Tier[] = [neues Nashorn(), neuer Elefant(), neue Schlange()]; // Nashorn | Elefant | Schlange

Wenn kein bester gemeinsamer Typ gefunden wird, ist das Ergebnis der Typinferenz ein Union-Array-Typ.

Union-Typen und Typwächter

Beispiel:

// Union-Typ Typ Typen = Zahl | Zeichenfolge

Funktion typeFn(Typ: Typen, Eingabe: Zeichenfolge): Zeichenfolge {
  // Wenn Sie dies schreiben, müssen Sie den Typ des Typs bestimmen}

Kann Typinferenz direkt zuweisen

let x:Zahl|Zeichenfolge = 1
x="gebunden"

Wenn Sie keine Beurteilung vornehmen, wird eine Fehlermeldung angezeigt.

Funktion typeFn(Typ: Zahl | Zeichenfolge, Eingabe: Zeichenfolge) {
  // Fehleroperator + kann nicht auf String angewendet werden 
  gibt neues Array zurück (Typ + 1).join("") + Eingabe
}

Wir müssen also urteilen

Funktion typeFn(Typ: Zahl | Zeichenfolge, Eingabe: Zeichenfolge) {
  // Typschutz wenn (Typ von Typ === 'Zahl') {
    gibt neues Array zurück (Typ + 1).join(" ") + Eingabe
  }
  Rückgabetyp + Eingabe
}

Bei der Typeingrenzung wird ein spezifischerer Typ basierend auf dem Beurteilungstyp neu definiert

Die Frage ist also, warum man das lernen sollte. Ist js nicht gut?

Persönliche Meinung:

Durch die Verwendung von TypeScript können Sie die Anfälligkeit von JavaScript als schwache Sprache verringern und das Fehlerrisiko durch falsche Typen sowie das Fehlerrisiko durch das Mischen verschiedener JavaScript-Versionen reduzieren.

TypeScript führt einfach die wichtigste Funktion der starken Typisierung höherer Sprachen in JavaScript ein und löst damit das Problem, unerwartete Fehler zu vermeiden, die beim Schreiben von JavaScript-Code durch die Konvertierung des Datentyps verursacht werden und die Fehlerbehebung erschweren.

Typwächter für typeof:

"Schnur"
"Nummer"
"bigint" // ES10 fügt "boolean" hinzu
"Symbol" // ES6 fügt "undefined" hinzu
"Objekt"
"Funktion"

Hinweis: typeof null ist gleich object

daher:

Funktion strOrName(str: string | string[] | null) {
  wenn (Typ von str === 'Objekt') {
    für (const s von str) {
      // Fehler melden, da str null sein könnte
      Konsole.log(s)
    }
  } sonst wenn (Typ von str === 'Zeichenfolge') {
    console.log(str)
  } anders {
    //......
  }
}

Einengung des Wahrheitswerts

Die Wahrheitstabelle von js ist sehr kompliziert. Außer dem Folgenden, das falsch ist, sind alle anderen wahr.

0
NAN
""
0n // Bigint-Version von 0 null
undefiniert

Um Nullfehler zu vermeiden, können Sie die Wahrheitswertverengung verwenden

// Verwende den wahren Wert um zu entscheiden, ob (str && typeof strs === 'object') {
  für (const s von strs) {
    Konsole.log(s)
  }
}

Oder das ist auch OK

Funktion valOrName(Werte: Zahl[] | undefiniert, Filter: Zahl): Zahl[] | undefiniert {
  wenn (!Werte) {
    Rückgabewerte
  } anders {
    Rückgabewerte.Filter(x => x > Filter)
  }
}

Zusammenfassung: Die Einengung des Wahrheitswerts hilft uns, null/undefiniert/0 und andere Werte besser zu handhaben

Einschränkung der Gleichheit

Wenn Sie die Gleichheit eingrenzen möchten, können Sie Operatoren wie ===, !==, ==, und und != verwenden, um die Gleichheit einzuschränken.

Beispiel 1:

Funktion strOrNum(x: Zeichenfolge | Zahl, y: Zeichenfolge | Boolescher Wert) {
  wenn (x === y) {
    // Zeichenfolge
  } anders {
    // Zeichenfolge|Zahl
  }
}

Beispiel 2:

Funktion strOrName(str: string | string[] | null) {
  wenn (str !== null) {
    wenn (Typ von str === 'Objekt') {
      für (const s von str) {
        konsole.log(s) // []
      }
    } sonst wenn (Typ von str === 'Zeichenfolge') {
      console.log(str) // Zeichenfolge
    } anders {
      // .....
    }
  }
}

Beispiel 3:

Schnittstellentypen {
  Wert: Zahl | null | undefiniert
}

Funktion valOrType(Typ: Typen, val: Zahl) {
  // null und undefined sind beide falsch und können nur Zahlen sein
  wenn (Typ.Wert != null) {
    Typ.Wert *= Wert
  }
}

bei der Operatoreingrenzung

prüft, ob eine Eigenschaft im Objekt vorhanden ist und fungiert nun als „Typwächter“.

Beispiel:

Schnittstelle A { a: Zahl };
Schnittstelle B { b: Zeichenfolge };

Funktion foo(x: A | B) {
    wenn ("a" in x) {
        Rückgabe xa;
    }
    Rückgabe xb;
}

Eingrenzung von instanceof

Die rechte Seite eines Instanceof-Ausdrucks muss vom Typ „any“ oder von einem Typ sein, der dem Funktionsschnittstellentyp zugewiesen werden kann.

Beispiel:

Funktion dateInval(x: Datum | Zeichenfolge) {
  wenn (x Instanz von Datum) {
    // Datum
  } anders {
    // Zeichenfolge
  }
}

Die Natur der Verengung

Das Wesentliche der Einengung ist die Neudefinition des Typs

Beispiel:

Funktion Beispiel() {
  let x: Zeichenfolge | Zahl | Boolescher Wert
  x = Math.random() < 0,5
  wenn (Math.random() < 0,5) {
    x = 'hallo' // Zeichenfolge
  } anders {
    x = 100 // Zahl
  }
  return x; // Zeichenfolge|Zahl
}

Eingrenzung von Union-Typen

Beispiel 1:

Schnittstelle Form {
  Art: "Kreis" | "Quadrat",
  Redius?: Zahl
  Seitenlänge?: Zahl
}

// Fehlerfunktion getArea(shape: Shape) {
	returniere Math.PI * shape.redius ** 2
}
// Eingrenzung oder Fehlerfunktion getArea(shape: Shape) {
  wenn (Form.Art === 'Kreis') {
    returniere Math.PI * shape.redius ** 2
  }
}
//Verwenden einer Assertion ungleich NULL-Funktion getArea(shape: Shape) {
  wenn (Form.Art === 'Kreis') {
    gib Math.PI * Form.redius zurück! ** 2
  }
}

Beispiel 2:

Schnittstelle Kreis {
  Art: "Kreis";
  Redius: Zahl;
}

Schnittstelle Quadrat {
  Art: "Quadrat";
  Redius: Zahl;
}

Typ Form = Kreis | Quadrat

Funktion getArea(Form: Form) {
  if (shape.kind === 'cirle') { // schmal return Math.PI * shape.redius ** 2
  }
}

// oder Funktion getArea(shape: Shape) {
  Schalter (Form.Art) {
    Fall "Kreis":
      returniere Math.PI * shape.redius ** 2
    Fall "Quadrat":
      returniere Form.Seitenlänge ** 2
    Standard:
      const _example: nie = Form
      returniere _Beispiel
  }
}

Zusammenfassen

Dies ist das Ende dieses Artikels über TypeScript-Lernhinweise zur Typverengung. Weitere relevante Inhalte zur TypeScript-Typverengung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • TypeScript-Typinferenz
  • Grundlegende TypeScript-Datentypen
  • Erweiterte TypeScript-Typen, die Sie nicht kennen (Zusammenfassung)
  • TypeScript-Lernhinweise: Grundlegende Typen

<<:  So ändern Sie die Master-Slave-Replikationsoptionen in MySQL online

>>:  Schritte zum Upgrade des Ubuntu 16.04-Kernels

Artikel empfehlen

Detaillierte Erläuterung des Prozesses der Verwendung von GPU in Docker

Inhaltsverzeichnis tf-gpu herunterladen Erstellen...

So verwenden Sie das Realip-Modul im Nginx-Grundlagenlernen

Vorwort Es gibt zwei Arten von Nginx-Modulen: off...

Die Einhandregel von WEB 2.0

<br />Mein vorheriger Artikel über CSS wurde...

Ein kurzer Vortrag über Responsive Design

1. Was ist Responsive Design? Responsive Design b...

Detaillierte Schritte zur Installation von Docker 1.8 auf CentOS 7

Docker unterstützt die Ausführung auf den folgend...

MySQL sql_mode-Analyse und Einstellungserklärung

Beim Einfügen eines Datensatzes in die MySQL-Date...

Implementierungscode für den MySQL-Protokolltrigger

SQL-Anweisung DROP-TRIGGER WENN EXISTIERT sys_men...

So installieren Sie RabbitMQ schnell in Docker

1. Holen Sie sich das Bild #Geben Sie die Version...

Detaillierte Erklärung von MySQLs Seconds_Behind_Master

Inhaltsverzeichnis Sekunden_hinter_Master Ursprün...

Die 10 klassischen Optimierungsfälle und -szenarien von MySQL

Inhaltsverzeichnis 1. Allgemeine Schritte zur SQL...

Erste Schritte mit SELinux

Bereits zu Kernel 2.6-Zeiten wurde ein neues Sich...

Detaillierte Erklärung des HTML-Bereichs-Tags

Der <area>-Tag definiert einen Bereich in e...

SQL-Fuzzy-Abfragebericht: ORA-00909: Lösung: Ungültige Anzahl von Parametern

Bei Verwendung einer Oracle-Datenbank für Fuzzy-A...