如何在TypeScript泛型中正确获取指定属性的对应类型?
问题解决方法
你只需要给getProperty函数新增第二个泛型参数用于捕获具体的属性类型即可,修正后的实现如下:
// 新增第二个泛型参数K,约束为T的属性名联合类型 function getProperty<T, K extends keyof T> (obj: T, property: K): T[K] { return obj[property]; }
调用方式
调用时可以手动指定泛型,也可以直接让TS自动推导返回值类型:
export type TestType = { key1: string, key2: number, key3: Array<string> }; const test:TestType = { key1: 'hello', key2: 56, key3: ['hi'] }; // 手动指定泛型的写法 const thisVariableShouldBeAString:string = getProperty<TestType, 'key1'>(test, 'key1'); // 自动推导的写法,无需手动标注类型,TS会自动识别返回值为string类型 const autoInferResult = getProperty(test, 'key1');
原代码问题说明
你之前的写法里property的类型是keyof T,属于所有属性名的联合类型,返回值T[typeof property]自然就是所有属性值的联合类型,无法关联到你实际传入的某一个具体key对应的类型。新增第二个泛型K后,TS会捕获你传入的具体属性字面量类型,从而精准匹配到对应属性的类型。
内容的提问来源于stack exchange,提问作者filipot
相关产品推荐
相关产品推荐

