这两个函数定义有什么区别?
使用第一个getProperty
,TypeScript可以推断 return 类型。但是第二个失败。
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
function getProperty2<T>(obj: T, key: keyof T) {
return obj[key];
}
let obj = {
a: 1,
name: 'test',
}
const name2 = getProperty(obj, 'name');
name2.length; // This is OK, name2 is infered as string
const name3 = getProperty2(obj, 'name');
name3.length; // This is ERROR! name3 is of type string | number
答案 0 :(得分:2)
在第一个上,K
被明确定义。因此,当您传递name
时,Typescript可以推断类型。但是在第二个函数中,getProperty2
函数期望任何keyof
T
。因此,返回类型将变为string | number
(如果您向obj
添加更多密钥,则会变得更加复杂)。这就是为什么Typescript不确定您会得到哪一个。
您可以按照以下说明使用as
来解决此问题,因为您可以肯定会得到string
的回报。
const name3 = getProperty2(obj, 'name') as string;
name3.length;