TypeScript 4.8 offiziell veröffentlicht

TypeScript 4.8 wurde offiziell veröffentlicht.

Änderungen seit Beta- und RC-Veröffentlichungen

Seit der  Beta -Version unterstützt die stabile Version nun das Ausschließen bestimmter Dateien vom automatischen Import . Die Beta-Ankündigung erwähnte keine Breaking Changes rund um ungenutzte destrukturierende Aliase in Typsignaturen. Darüber hinaus beschreiben weder die Beta- noch die RC-Release-Ankündigungen API Breaking Changes in TypeScript-Syntaxbaum-Dekoratoren. Diese sind in der Ankündigung der neuen Version aufgeführt.

große Änderungen


Erweiterungen zur Typeinschränkung für Schnittmengentypen und Vereinigungstypen

Die Version TypeScript 4.8 weist weitere Verbesserungen auf, hauptsächlich beim Ausdruck von Vereinigungstypen und Schnittmengentypen sowie beim Eingrenzen von Typen. --strictNullChecks 

Als oberster Typ im TypeScript-Typsystem umfasst der unbekannte Typ beispielsweise alle anderen Typen.Tatsächlich ist die Auswirkung von unknown und unknown dieselbe: die eindeutige Bedeutung von null, undefinierten Typen plus der Ursprung aller Dinge . {} | null | undefined  {}

leiten Sie die Extraktion im Vorlagen-String-Typ ab

In Version 4.7 unterstützt TypeScript die Infer Extends-Syntax, sodass wir den Wert des erwarteten Typs in einem Schritt direkt ableiten können, ohne die bedingte Anweisung erneut beurteilen zu müssen:

type FirstString<T> =
    T extends [infer S, ...unknown[]]
        ? S extends string ? S : never
        : never;
​
// 基于 infer extends
type FirstString<T> =
    T extends [infer S extends string, ...unknown[]]
        ? S
        : never;

Version 4.8 verbessert dies weiter. Wenn Infer darauf beschränkt ist, ein primitiver Typ zu sein, leitet es jetzt die Typinformationen von Infer so weit wie möglich auf die Literaltypebene ab:

// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
​
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;

Gleichzeitig überprüft TypeScript, ob der extrahierte Wert wieder auf den ursprünglichen String zurückgeführt werden kann. Zum Beispiel prüft SomeNum, ob er gleich ist . Im folgenden Beispiel kann nur auf den Zahlentyp geschlossen werden, weil dies nicht möglich ist neu zugeordnet: String(Number("100"))  "100"

// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never; 

Typableitung in gebundenen Typen

Das generische Padding in TypeScript wird auch von seinem Aufrufer beeinflusst, wie im folgenden Beispiel:

declare function chooseRandomly<T>(x: T,): T;
​
const res1 = chooseRandomly(["linbudu", 599, false]);

An diesem Punkt werden der Typ von res1 und das generische T der Funktion als abgeleitet , aber wenn wir die Methode ändern: Array<string | number | boolean>

declare function chooseRandomly<T>(x: T,): T;
​
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);

Zu diesem Zeitpunkt werden a, b und c als String-, Zahlen- und boolesche Typen abgeleitet, was bedeutet, dass der generische Typ der Funktion mit einem solchen Tupeltyp gefüllt wird. [string, number, boolean] 

Diese Art des Füllens von Generika wird Bindungsmuster genannt, und in Version 4.8 ist die Typableitung basierend auf Bindungsmustern deaktiviert, da ihre Auswirkung auf Generika nicht immer korrekt ist:

declare function f<T>(x?: T): T;
​
const [x, y, z] = f();

Einzelheiten finden Sie in der Release-Ankündigung .

Ich denke du magst

Origin www.oschina.net/news/208127/typescript-4-8-released
Empfohlen
Rangfolge