在 TypeScript 中,假如你之前已经定义过一个对象,如
const obj = {
A: 1,
B: 2,
C: 3
}之后,你想定义一个函数,这个函数的入参就是上面的这个对象的值的其中一个,也就是
function func(val: 1 | 2 | 3) {}此时,可以通过对象key取值方法来取obj对象的可能值作为枚举类型
具体方法为
步骤 1:修改对象的定义,在后面加上 as const
const obj = {
A: 1,
B: 2,
C: 3
} as const; // 使用 `as const` 确保对象是只读的步骤 2:提取值的联合类型
使用 typeof 和 keyof 提取对象的值作为联合类型:
function func(val: typeof obj[keyof typeof obj]) {}解读
- typeof obj 获取 obj 的类型。
- keyof typeof obj 获取 obj 的所有键(即 "A" | "B" | "C")。
- typeof obj[keyof typeof obj] 获取 obj 的所有值的联合类型(即 1 | 2 | 3)。
上面的代码有两个关键
as const:将对象标记为只读,确保 TypeScript 推断出具体的字面量类型(如 1 而不是 number)。typeof MODES[keyof typeof MODES]:通过索引访问对象的值类型,生成联合类型 1 | 2 | 3。
扩展:提取键的联合类型
如果你还需要提取键的联合类型(如 "A" | "B" | "C"),可以这样做:
type ModeKeys = keyof typeof MODES;总结
通过 typeof 和 keyof,你可以轻松提取对象的键或值的联合类型。这种方法非常适合将常量对象转换为枚举类型,同时保持类型安全。如果你有其他问题,欢迎随时提问!
评论 (0)