在 TypeScript 中根据对象的值创建类型
Create a Type from an object’s Values in TypeScript
从对象的值创建类型:
- 声明对象时使用 const 断言。
- 用于
keyof typeof
获取表示对象键的类型。 - 在特定键处索引对象的类型以获取其值的类型。
索引.ts
const employee = { id: 1, name: 'James Doe', salary: 100, } as const; // 👈️ use const assertion // 👇️ type Keys = "id" | "name" | "salary" type Keys = keyof typeof employee; // 👇️ type Values = 1 | "James Doe" | 100 type Values = typeof employee[Keys];
该as const
语法称为
const 断言。我们用它来声明一个不可变对象。
我们必须这样做,因为它可以帮助我们缩小对象值的类型。
索引.ts
// 👇️ const employee: { // readonly id: 1; // readonly name: "James Doe"; // readonly salary: 100; // } const employee = { id: 1, name: 'James Doe', salary: 100, } as const; // 👈️ use const assertion
上面示例中对象的值类型为1
,James Doe
和
100
,这正是我们需要获得表示对象值的类型的类型。
TypeScript 能够如此具体,因为它知道属性是并且值永远不会改变。
readonly
如果我们不使用 const 断言,我们将获得更多对象值的通用类型。
索引.ts
// 👇️ const employee: { // id: number; // name: string; // salary: number; // } const employee = { id: 1, name: 'James Doe', salary: 100, };
上面的示例没有使用类型断言,因此对象值的类型应该是string | number
,这可能不是您需要的。
我们使用
keyof typeof
来获取对象键的类型。
索引.ts
const employee = { id: 1, name: 'James Doe', salary: 100, } as const; // 👇️ type Keys = "id" | "name" | "salary" type Keys = keyof typeof employee; // 👇️ type Values = 1 | "James Doe" | 100 type Values = typeof employee[Keys];
该keyof typeof
语法返回一个类型,该类型将对象的所有键表示为字符串。
为了获得对象值的类型,我们使用方括号并使用键的类型为对象建立索引。
您也可以使用这种方法来获取对应于特定属性的值的类型。
索引.ts
const employee = { id: 1, name: 'James Doe', salary: 100, } as const; // 👇️ type Keys = "id" | "name" | "salary" type Keys = keyof typeof employee; // 👇️ type Values = 1 | "James Doe" | 100 type Values = typeof employee[Keys]; // 👇️ type V1 = 1 type V1 = typeof employee['id']; // 👇️ type V2 = "James Doe" type V2 = typeof employee['name']; // 👇️ type V3 = 100 type V3 = typeof employee['salary'];