📘

[ TypeScript ] オブジェクトの値でリテラル型のユニオンを作る

2023/10/04に公開

次のようなJavaScriptのオブジェクトがあったとします

const test = {
  a: "hello",
  b: "world",
  c: 0
}

このオブジェクトの値、つまり"hello"、 "world"、 0を使って、次のようなリテラル型のユニオンを作りたいとします。

type TestValues = "hello" | "world" | 0

答えは次のとおりです。

const test = {
  a: "hello",
  b: "world",
  c: 0
} as const // <== !!!

type TestValues =  (typeof test)[keyof typeof test]
// type TestValues = 0 | "hello" | "world"

as constを忘れずに。

つけ忘れた場合、つぎのようにプリミティブ型のユニオンになります。

const test = {
  a: "hello",
  b: "world",
  c: 0
}

type TestValues =  (typeof test)[keyof typeof test]
// type TestValues = string | number

ちなみにオブジェクトの値ではなく、キーをもとに同様の型をつくりたい場合は次のとおりです。

const test = {
  a: "hello",
  b: "world",
  c: 0
}

type TestKeys =  keyof typeof test
// type TestKeys = "a" | "b" | "c"

Discussion