≪ Today I learned. RSS購読
公開日
更新日
タグ
TypeScript
著者
ダーシノ(@bc_rikko)

TypeScript 5.4がリリースされた

TypeScript 5.4 betaがリリースされた。

主なアップデート

  1. ナローイングが賢くなった
  2. 新しいNoInfer<T>がユーティリティタイプに追加された
  3. ES2024で追加予定のObject#groupByMap#groupByが追加された
  4. 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が正式リリースされた。