如何基于函数参数自定义类型,使返回对象拥有确定键类型?
让TypeScript动态创建的对象推导具体键类型
要让createTypedObject返回带有具体键名的类型(比如{test: number}),核心是让TypeScript捕获传入的name参数的具体字符串字面量类型,而不是宽泛的string类型。可以通过泛型实现:
方案一:泛型接口+映射类型
interface Params<K extends string> { name: K } const createTypedObject = <K extends string>(params: Params<K>) => ({ [params.name]: 1, }) as { [Key in K]: number }
方案二:简化的泛型参数写法
如果不需要单独定义Params接口,可以直接给函数参数指定泛型:
const createTypedObject = <K extends string>(params: { name: K }) => ({ [params.name]: 1, }) as { [Key in K]: number }
效果验证
调用函数时,TypeScript会自动推导传入的name的具体值作为键类型:
const obj = createTypedObject({ name: 'test' }) // obj 的类型现在是 { test: number }
原理说明
原来的代码中,Params的name类型是string,TypeScript会把动态生成的键推断为字符串索引签名{[p: string]: number}。通过泛型K extends string,我们让TypeScript保留传入的具体字符串字面量信息,再通过映射类型{ [Key in K]: number }明确返回对象的键就是该字面量,值为number类型。
内容的提问来源于stack exchange,提问作者Kiritushka
相关产品推荐
相关产品推荐

