TypeScript 5.4がリリースされた
TypeScript 5.4 betaがリリースされた。
主なアップデート
- ナローイングが賢くなった
- 新しい
NoInfer<T>
がユーティリティタイプに追加された - ES2024で追加予定の
Object#groupBy
とMap#groupBy
が追加された - ImportAttributes(
import … from …. with { type: 'ここの部分' }
)がチェックされるようになった
NoInfer<T>
を使ってみる
まず普通に実装してみる
以下のコードはエラーにはならないけど、yellowはlistに含まれていないので好ましくない。
function pick<T extends string>(list: T[], val: string): void {}
pick(['red', 'green', 'blue'], 'yellow')
引数(val
)で受け取る値を制限したい
Microsoftのドキュメント読むとシグネチャ内でしか使わない型パラメータは悪くはないけど「コードの臭い」になるとのこと。
function pick<T extends string, P extends T>(list: T[], val: P): void {}
// Argument of type '"yellow"' is not assignable to parameter of type '"red" | "green" | "blue"'.
pick(['red', 'green', 'blue'], 'yellow')
NoInfer<T>
を使って型パラメータを増やさない
NoInfer<T>
を使うことで、 Tの型で制限できる。
function pick<T extends string>(list: T[], val: NoInfer<T>): void {}
// Argument of type '"yellow"' is not assignable to parameter of type '"red" | "green" | "blue"'.
pick(['red', 'green', 'blue'], 'yellow')
追記: 2024-03-07
TypeScript 5.4が正式リリースされた。