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

Implementierung eines CSS-Textschatten-Effekts zur allmählichen Unschärfe

Textschatten Fügen Sie dem Text einen Schatten hi...

Detailliertes Beispiel zur Verwendung der distinct-Methode in MySQL

Ein deutlicher Bedeutung: distinct wird verwendet...

Detaillierte Erklärung zum MySQL-Index

Inhaltsverzeichnis 1. Index-Grundlagen 1.1 Einlei...

Analyse des Konfigurationsprozesses der Nginx-HTTP-Integritätsprüfung

Passive Prüfung Mit passiven Integritätsprüfungen...

Tipps zum Schreiben prägnanter React-Komponenten

Inhaltsverzeichnis Vermeiden Sie die Verwendung d...

MySQL-Dateneinfügungsoptimierungsmethode concurrent_insert

Wenn ein Thread eine DELAYED-Anweisung für eine T...

Eine einfache Methode zum Ändern der Größe hochgeladener Nginx-Dateien

Originallink: https://vien.tech/article/138 Vorwo...

Beispielcode zur Implementierung einer Upload-Komponente mit Vue3

Inhaltsverzeichnis Allgemeine Entwicklung von Upl...

Unabhängige Implementierung der Nginx-Containerkonfigurationsdatei

Erstellen eines Containers [root@server1 ~]# dock...

Problem mit der Groß-/Kleinschreibung in der MySQL-Datenbank

In MySQL entsprechen Datenbanken Verzeichnissen i...