TypeScript:如何从对象类型推断属性对应的具体值类型?
解决TypeScript中[属性, 值]元组的类型自动推断问题
你原来的DoubleTuple类型存在核心问题:infer P会把P推断为对象所有属性名的联合类型,对应的T[P]就变成了所有值类型的联合,导致不管输入哪个属性,值都允许number | string,完全失去了类型校验的意义。
正确的元组联合类型定义
我们需要为对象的每个属性单独生成对应的[属性名, 属性值类型]元组,再把这些元组组成联合类型,这样TypeScript就能根据属性名自动锁定对应的值类型:
type DoubleTuple<T> = { [K in keyof T]: [K, T[K]] }[keyof T]; interface ExampleModel { a: number; b: string; } // 合法:属性'a'对应值类型number const tuple1: DoubleTuple<ExampleModel> = ["a", 3]; // 报错:属性'a'不允许字符串值(TypeScript会提示类型不匹配) const tuple2: DoubleTuple<ExampleModel> = ["a", "3"]; // 合法:属性'b'对应值类型string const tuple3: DoubleTuple<ExampleModel> = ["b", "3"];
更便捷的函数辅助推断
如果不想每次都显式指定DoubleTuple<ExampleModel>,可以写一个辅助函数让TypeScript自动完成类型推断:
interface ExampleModel { a: number; b: string; } function createTuple<T, K extends keyof T>(key: K, value: T[K]): [K, T[K]] { return [key, value]; } // 自动推断出tuple的类型为["a", number] const tuple = createTuple<ExampleModel>("a", 3); // 报错:类型'"3"'不能赋值给类型'number' const wrongTuple = createTuple<ExampleModel>("a", "3");
内容的提问来源于stack exchange,提问作者jimin hu
相关产品推荐
相关产品推荐

