首页 > 解决方案 > TypeScript 泛型函数参数和返回类型推断

问题描述

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

使用 first getProperty,TypeScript 可以推断返回类型。但是第二个失败了。

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

标签: typescripttypescript-generics

解决方案


在第一个上,K是明确定义的。因此,当您通过 时name,Typescript 可以推断类型。但是在第二个中,getProperty2函数需要 any keyof T。因此,返回类型变为string | number(如果您向 中添加更多键obj,这将变得更加复杂)。这就是为什么 Typescript 不确定你会得到哪一个。

您可以使用as以下方法解决此问题,因为您确信您会得到string回报。

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

推荐阅读