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
- Verbesserte Cross-Type-, Union-Type-Kompatibilität und Typverengung
- Verbessern
infer
Sie die Typableitung für Vorlagen-String-Typen - Optimierung und
--build
--watch
--incremental
Leistung _ - Optimieren Sie die Fehlermeldung beim Vergleich von Objekt- und Array-Literalen
- Verbessern Sie die Typableitung in gebundenen Typen
- Dateiüberwachungsfunktion behoben (insbesondere
git checkout
szenarioübergreifend) - Verbesserte Leistung von Find-All-References
- Schließen Sie bestimmte Dateien vom automatischen Import aus
- Korrektheitskorrekturen und Kompatibilitätsä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();