TypeScript泛型函数参数和返回类型推断

时间:2019-09-23 08:02:42

标签: typescript typescript-generics

这两个函数定义有什么区别?

使用第一个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

1 个答案:

答案 0 :(得分:2)

在第一个上,K被明确定义。因此,当您传递name时,Typescript可以推断类型。但是在第二个函数中,getProperty2函数期望任何keyof T。因此,返回类型将变为string | number(如果您向obj添加更多密钥,则会变得更加复杂)。这就是为什么Typescript不确定您会得到哪一个。

您可以按照以下说明使用as来解决此问题,因为您可以肯定会得到string的回报。

const name3 = getProperty2(obj, 'name') as string;
name3.length;