【TS】discriminated unionのnarowwingについて
こんにちは、Devチームの澁谷です。
皆さんはTypeScirptを触っていてこんな経験はないでしょうか。
「あれ、型が絞り込めてない。なぜ・・・?」
最近の実装でGraphQLのUnion Typeを利用することがあり、この問題に直面しました。
ユニオンなので__typename
をみて適当な型にしてあげたかったんですが、絞り込みがなかなかうまくいかない。
type User =
| { __typename?: 'A'; gender: string; }
| { __typename?: 'B'; age: number; }
const func = (user: User) => {
if (!!user.__typename && user.typename !== 'A') {
return user.gender // エラー
}
}
私もつい最近そんなことがあったり、チームのメンバーがこの問題に直面した場面も見ました。
そしてこのことについて調べていると
TypeScriptがパフォーマンスを理由に制限をかけている
というとても面白いことが分かってきました。
フェローの@ozu_syoさんにもアドバイスをいただいた記事です。
フロントエンドエンジニアの方は是非見てみてください。
【TypeScript】discriminated unionでnarowwingできていなかった事例