TypeScript如何兼顾对象类型检查并生成指定键联合类型?
TypeScript 同时实现对象类型校验与自动生成键联合类型
要解决既保证animals对象的类型校验,又能自动生成具体键的联合类型作为AnimalId的问题,有两种实用方案:
方案一:泛型函数约束(兼容低版本TS)
先定义基础的Animal类型,再通过泛型函数约束对象结构,同时保留键的字面量类型:
// 定义Animal基础类型 type Animal = { name: string; age: number; }; // 泛型函数:约束输入对象的每个值符合Animal类型,同时返回原类型以保留键的字面量 function createAnimals<T extends Record<string, Animal>>(animals: T): T { return animals; } // 创建符合类型约束的animals对象 const animals = createAnimals({ bear: { name: "Bear", age: 5 }, lion: { name: "Lion", age: 7 } }); // 自动生成具体键的联合类型 type AnimalId = keyof typeof animals; // 类型为 "bear" | "lion"
如果animals里的属性不符合Animal类型(比如把age写成字符串),TypeScript会直接报错,同时AnimalId能准确获取对象的键集合。
方案二:使用satisfies操作符(TS 4.9+)
利用TypeScript 4.9新增的satisfies操作符,结合const断言保留字面量类型,写法更简洁:
type Animal = { name: string; age: number; }; // 使用satisfies约束类型,as const保留键的字面量窄类型 const animals = { bear: { name: "Bear", age: 5 }, lion: { name: "Lion", age: 7 } } as const satisfies Record<string, Animal>; type AnimalId = keyof typeof animals; // 类型为 "bear" | "lion"
这种写法无需额外函数,同样能在animals类型不符合时给出报错,同时自动生成准确的AnimalId联合类型。
内容的提问来源于stack exchange,提问作者kess
相关产品推荐
相关产品推荐

