TypeScript中如何让动态取对象值的函数返回对应键的类型?
解决方案
完全可以实现这个需求,核心是利用TypeScript的泛型和索引访问类型自动推导返回值的具体类型,无需类型断言或条件判断。
修改后的代码示例
// 先定义各个值对应的类型(示例) type TypeA = { id: number; name: string }; type TypeB = { flag: boolean; desc: string }; type TypeZZZ = { data: string[] }; // 定义对象,TypeScript会自动推导每个键对应的类型 const obj = { typeA: {} as TypeA, typeB: {} as TypeB, typeZZZ: {} as TypeZZZ }; // 泛型函数:K约束为obj的键类型,返回值为对应键的属性类型 const destruct = <K extends keyof typeof obj>(key: K): typeof obj[K] => { return obj[key]; }; // 调用时自动推断正确类型 const typeA = destruct('typeA'); // 类型为TypeA const typeB = destruct('typeB'); // 类型为TypeB const typeZZZ = destruct('typeZZZ'); // 类型为TypeZZZ
原理说明
- 泛型参数K:会捕获调用时传入的具体键名(比如
'typeA'),TypeScript会自动将K的类型收窄为该具体字符串字面量类型。 - 索引访问类型
typeof obj[K]:根据K的具体值,从对象obj的类型中取出对应键的属性类型,实现类型的自动匹配。
如果一定要保留你原来定义的keys联合类型,也可以将泛型约束改为K extends keys,但直接从typeof obj推导键类型更简洁,避免重复定义。
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

