TypeScript オブジェクトからオブジェクトの値のunion型をつくる

オブジェクトから型を作る

ジャンケンオブジェクト

const hands = {
    gu: "グー",
    choki: "チョキ",
    pa: "パー"
} 

as const をつけることで読み取り専用になる

const hands = {
    gu: "グー",
    choki: "チョキ",
    pa: "パー"
} as const;

中身

const hands: {
    readonly gu: "グー";
    readonly choki: "チョキ";
    readonly pa: "パー";
}

ベタ書きで union型 をつくるなら

type Hand = "グー" | "チョキ" | "パー";

typeofで型情報を見る

type Hoge = typeof hands;

中身

const hands: {
    readonly gu: "グー";
    readonly choki: "チョキ";
    readonly pa: "パー";
}

keyofで、key名からunion型を定義する

type Keys = keyof Hoge;

Keysの中身

type Keys = "gu" | "choki" | "pa"

typeofで型情報を見る。typeofとhandsのグーでつくる

type Hand = typeof hands["gu"];

中身

type Hand = "グー"

typeofとKeysを使って型情報を見る

type Hand = typeof hands[Keys];

中身

type Hand = "グー" | "チョキ" | "パー"

一気にオブジェクトの値のunion型を生成する

type Hand = typeof hands[keyof typeof hands];

中身

type Hand = "グー" | "チョキ" | "パー"

参考サイトというかぱくり

https://qiita.com/Yametaro/items/f8f9023c5e14c9a1e375