-
Notifications
You must be signed in to change notification settings - Fork 108
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
never
が絡んだ型推論についての質問です
#627
Comments
自分はこのレポジトリの管理者ではないのですが、たまたまこのissueを見かけ、参考になりそうな情報を持っていたので一応共有いたします👶 挙動の理由前提として、 なお、この挙動は公式ドキュメントでは言及されていない(ように思える)のですが、公式のissuesでは過去に言及されているようです👶 この前提を踏まえると、 @matoruru さんの仰る挙動も説明がつくのではと考えています。
一方で 解決策のアイデア解決策のアイデアとしては、第一項を配列型にしてしまう策があります(先ほど紹介したissuesの議論にも登場しているようです: https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379091887)。 これで実際に試してみると、下記のように期待される結果になりました!👶 留意点ただ、私自身あまりわかっていないのですが、TSで型の同一性を正確に評価するにはなんだかもう少し工夫が必要なようです……! |
これはconditional typeがunion distributionするのと、neverが空のユニオンであるために発生する事象です。 conditional typeの型パラメーターはユニオンに展開されます。 type X<T> = T extends string ? 'string' : 'not-string'; のような型があるとき、 type Y = X<string | number>; は type Y = X<string> | X<number>; のように分配されます。 次のようにneverを渡した場合ですが、 type Y = X<never>; neverは空のユニオンと決められているので、分配が行えなくなります。そのため、「分配できませんでした」の意味でneverが返されます。 本当にneverが空のユニオンかどうかは、次のように1つの型から構成されるユニオン型から、その最後の1つの型を取り除くことで確認することもできます。 type X = Exclude<string, string>; // stringからなるユニオンからstringを取り除いたら…
// X は neverになる ちなみに、neverをconditonal typeで扱える方法もあります: https://zenn.dev/suin/scraps/8828d6c915298c |
@canalun さんも回答ありがとうございます! |
理解の手助けになったようでなによりです😌 |
型の一致不一致を確認するための型
Equal
を作りました。Equal
に渡す引数のA
とB
が等しければ"true"
、そうでなければ"false"
になるように作っています。しかし
never
を渡した時だけ挙動が変わってしまいます。Equal
の条件では等しくなければ"false"
に推論されるはずですし、Test4
ではnever
とnever
の比較なので"true"
に推論されるのが妥当だと考えていました。Test5
だけ"false"
に推論されているのも理解できません。これは
never
の仕様から説明できるでしょうか・・・?ご回答お待ちしています。よろしくお願いいたします。
関連ページ: https://typescriptbook.jp/reference/statements/never
The text was updated successfully, but these errors were encountered: