2021年11月26日

slug
2021-11-26
date
Nov 26, 2021
summary
Amazonブラックフライデー、型パズル
status
Published
tags
プログラミング
買い物
type
Post
Property

ジッと見てたアイテム

 
 
世の中には面白い人がいると思った。
自分はほんとうにまだまだだと痛感した。
 

ネストしたTypeScriptの型をAltするところを展開する方法

type A = {
    id: string
}

type B = {
    age: number;
    gender: 0 | 1| 2;
}
type C = A & B
type Flatten<T> = {
    [P in keyof T]: T[P]
}
// これでようやく C の中身が展開される
type E = Flatten<C>

// ただし、オブジェクトがネストすると Flatten の効果が消える
type F = {
    Nest: Flatten<C>
}

// C 型に別のオブジェクトの型を混ぜた intersection 型を作る場合
type G<T> = {
    Nest: {
        [P in keyof T]: T[P];
    } & {createdAt : Date}
}
// 型情報は展開されている
type H = G<C>

// 上記の複数オブジェクトを混ぜる方法を type として定義してマージする型パズル
type CreatedAt = {
    createdAt : Date;
}
type I<T> = {
    Nest: {
        [P in keyof T | keyof CreatedAt]: P extends keyof CreatedAt ? CreatedAt[P] : P extends keyof T ? T[P]: never;
    }
}
type O = I<C>

// ジェネリックスで複数の型を受け取るパターン
// だいぶスッキリしてきた
type J<T, K> = {
    Nest: {
        [P in keyof T | keyof K]: P extends keyof K ? K[P] : P extends keyof T ? T[P]: never;
    }
}
type N = J<C, CreatedAt>
 
 
 
 

© Yoshiyuki Hisamatsu 2021 - 2022