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

    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が正式リリースされた。