📘
[ TypeScript ] オブジェクトの値でリテラル型のユニオンを作る
次のような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