TypeScript 4.8 が正式にリリースされました。
Beta および RC リリース以降の変更点
ベータリリース以降 、安定版では特定のファイルを自動インポートから除外する機能がサポートされるようになりました。ベータ版の発表では、型シグネチャの未使用のデストラクチャリング エイリアスに関する重大な変更については言及されていませんでした。さらに、ベータ版も RC リリースのアナウンスも、TypeScript 構文ツリー デコレーターの API 破壊的変更については説明していません。これらについては、新しいリリースの発表で詳しく説明されています。
主な変更点
- クロス型、共用体型の互換性、および型のナローイングの改善
- テンプレート文字列型の型推定を改善する
infer
- 最適化、および
--build
--watch
--incremental
パフォーマンス - オブジェクト リテラルと配列リテラルを比較するときのエラー メッセージを最適化する
- バインドされた型の型推論を改善する
- ファイル監視機能の修正 (特にクロス
git checkout
シナリオ) - すべての参照の検索パフォーマンスの向上
- 特定のファイルを自動インポートから除外する
- 正確性の修正と互換性の変更
交差タイプと共用体タイプのタイプの絞り込みの機能強化
TypeScript 4.8 バージョンでは、主に共用体型と交差型の式の表現と型の絞り込みがさらに強化されています。 --strictNullChecks
For example, as the Top Type in the TypeScript type system, the unknown type includes all other types. 実際、unknown と unknown の効果は同じです: null の固有の意味、未定義の型、およびすべてのものの起源. {} | null | undefined
{}
テンプレート文字列型で抽出を推測する
バージョン 4.7 では、TypeScript は infer extends 構文をサポートしているため、条件ステートメントを再度判断する必要なく、期待される型の値を 1 ステップで直接推測できます。
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;
バージョン 4.8 ではこれがさらに強化され、infer がプリミティブ型に制限されている場合、infer の型情報を可能な限りリテラル型レベルに推定するようになりました。
// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;
At the same time, TypeScript will check whether the extracted value can be remapped back to the original string. For example, SomeNum will check if it is equal . 次の例では、数値型にはできないため、数値型にしか推測できません。再マップされた: String(Number("100"))
"100"
// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never;
バインドされた型の型推論
次の例のように、TypeScript のジェネリック パディングも呼び出し元の影響を受けます。
declare function chooseRandomly<T>(x: T,): T;
const res1 = chooseRandomly(["linbudu", 599, false]);
この時点で、 res1 の型と関数のジェネリック T は と推定されますが、メソッドを変更すると、次のようになります。 Array<string | number | boolean>
declare function chooseRandomly<T>(x: T,): T;
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);
このとき、a、b、c は文字列型、数値型、ブール型として推定されます。これは、関数のジェネリック型がこのようなタプル型で満たされていることを意味します。 [string, number, boolean]
ジェネリックにデータを入力するこの方法はバインディング パターンと呼ばれ、バージョン 4.8 では、ジェネリックへの影響が常に正しいとは限らないため、バインディング パターンに基づく型推定は無効になっています。
declare function f<T>(x?: T): T;
const [x, y, z] = f();