【TS】discriminated unionのnarowwingについて | Dev Driven 開発・デザインチーム 【TS】discriminated unionのnarowwingについて | 働くひとと組織の健康を創る iCARE

BLOG

【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できていなかった事例