一、同时定义常量对象和对应的值类型
javascript
const MODE = { M1: 'm1', M2: 'm2' } as const;
type Mode = (typeof MODE)[keyof typeof MODE];
1、定义常量对量
as const(const 断言)做了两件事:
(1)把对象变成 readonly(不可修改)
(2)把属性值从宽泛的 string 收窄为字面量类型
javascript
// 没有 as const → { M1: string; M2: string }
// 有 as const → { readonly M1: 'm1'; readonly M2: 'm2' }
这样 MODE.M1 的类型就是 'm1' 而不是 string。
2、提取值的联合类型
| 步骤 | 表达式 | 结果 |
|---|---|---|
| 1 | typeof MODE |
{ readonly M1: 'm1'; readonly M2: 'm2' } |
| 2 | keyof typeof MODE |
`'M1' |
| 3 | (typeof MODE)[keyof typeof MODE] |
`'m1' |
所以最终 Mode 等价于:
javascript
type Mode = 'm1' | 'm2';
其中 keyof 是一个类型运算符,作用是:取出一个类型中所有键(属性名),组成一个联合类型。
javascript
type Person = {
name: string;
age: number;
email: string;
};
type Keys = keyof Person;
// 等价于:'name' | 'age' | 'email'