👍

TypeScript 5.4 の NoInfer が良さそう

2024/03/07に公開

Announcing TypeScript 5.4

Announcing TypeScript 5.4を眺めていて、NoInfer という Utility Type が追加されたことを知りました!
記事を読んでいると良さそうだったので、二番煎じではありますが試した内容を残しておきます!

背景

提案されたのは、7年前のこちらの Issue のようでした。
https://github.com/microsoft/TypeScript/issues/14829

class Animal { move }
class Dog extends Animal { woof }

function doSomething<T>(value: T, getDefault: () => T) { }
// Wanted an error here - getDefault() ought to return same type as 'value'
doSomething(new Dog(), () => new Animal());

doSomething の 第二引数で返される ジェネリクスT は、第一引数のDog であるように制限したいが、DogAnimalextends しているので、型推論が効いてしまって Animal でも型エラーにならないことが良くないのではないかといった内容です。

Playground で試してみる

without NoInfer

NoInfer を使っていない場合は、型推論が効いて Animal になっているのが分かります。

with NoInfer

NoInfer を使うことで、型推論を制限することができ、第一引数に渡した Dog であることをチェックしてくれるようになりました!🎉

もう少し試してみます〜

getCountries という第一引数に countries を、第二引数に defaultCountry を受け取るような関数があるとします。

このとき、NoInfer をつけていないと、defaultCountrycountries に含まれない場合でもエラーにはなりません。

without NoInfer2

しかし、NoInfer をつけると第一引数の countries で型推論を制限してくれるようになりました〜!

with NoInfer2

Discussion