TypeScript通过函数返回对象属性时如何推导精确属性类型
解决方法
你只需要给函数新增一个泛型参数捕获传入的键的具体类型即可,修改后的代码如下:
function testAccess<T, K extends keyof T>(o: T, p: K): T[K] { return o[p] } const a = testAccess(testObject, 'a') // 推导类型为 string const b = testAccess(testObject, 'b') // 推导类型为 number const c = testAccess(testObject, 'c') // 推导类型为 boolean
问题原因
你原来的写法存在两个问题:
- 只声明了一个泛型参数
T,参数p的类型标注为keyof T,这里的keyof T是目标对象所有键的联合类型,TypeScript只会把p识别为这个联合类型,不会自动追踪你实际传入的具体是哪一个键。 - 返回值类型写的
T[typeof p]本质上等价于T[keyof T],也就是所有属性类型的联合,自然无法得到精准类型。
新增泛型参数K extends keyof T之后,TypeScript会自动根据你调用时传入的键值,把K绑定为对应的字面量类型,返回值T[K]就能精准匹配到该键对应的属性类型。
内容的提问来源于stack exchange,提问作者korun
相关产品推荐
相关产品推荐

