TypeScript如何通过类型推断自动定义对象的合法键而无需手动声明?
TypeScript自动推导对象嵌套键类型方案
你原写法的问题在于:手动给myObject标注了IMyObject类型,而IMyObject中将bucket1定义为Record<string, string>,类型直接被拓宽为「任意字符串为键、值为字符串的对象」,TS自然不会对键的合法性做校验。
方法1:使用satisfies操作符(TS 4.9+ 推荐)
TS 4.9新增的satisfies关键字刚好适配这个场景:它会校验值是否符合指定类型的结构,但不会把值的类型强制拓宽为指定类型,会完整保留值本身的精确类型信息。
示例代码:
interface IMyObject { bucket1: Record<string, string>; } const myObject = { bucket1: { itemA: "itemA", itemB: "itemB", }, } satisfies IMyObject; // 访问不存在的键会直接报错:Property 'itemC' does not exist on type '{ itemA: string; itemB: string; }' const itemC = myObject.bucket1.itemC;
方法2:泛型工具函数(兼容低版本TS)
如果你使用的TS版本低于4.9,可以自己写一个简单的泛型工具函数实现相同效果:
interface IMyObject { bucket1: Record<string, string>; } // 泛型工具:校验输入符合IMyObject结构,同时返回输入的精确类型 function createMyObject<T extends IMyObject>(obj: T) { return obj; } const myObject = createMyObject({ bucket1: { itemA: "itemA", itemB: "itemB", }, }); // 同样会触发类型错误 const itemC = myObject.bucket1.itemC;
两种方案都不需要你手动枚举任何键,TS会自动从你写的对象字面量中提取所有已存在的键作为合法类型,访问不存在的键时就会抛出类型错误。
内容的提问来源于stack exchange,提问作者wongx
相关产品推荐
相关产品推荐

