👌

TypescriptのExtractでオブジェクトユニオンから1個とりだす

2021/09/30に公開

ユニオンから type: aの型だけ抜き出したい。

Extractでできます。

type Payload = {
    type: 'a',
    data: number;
} | {
    type: 'b',
    data: string;
};

type PayloadA = Extract<Payload, {type: 'a'}>; // <- ここ

コード部分では、こう。

// no error
const payloadA1: PayloadA = {
    type: "a"
    data: 100
};

// error
const payloadA2: PayloadA = {
    type: "b"
    data: '100'
};

独自実装しようとしてだめだった実装

Extractでできるってことを知らなかった時代に書いたやつ。

type ExtractByKey<
    Base extends Record<string, any>,
    Key extends keyof Base,
    Value extends Base[Key]
> = Base[Key] extends Value ? Base : never;

参考

参考というか答えが書いてある。
https://qiita.com/katsuya_U/items/6269b50f27b54bb84fff

Discussion