【问题标题】:TypeScript generic function param and return type inferenceTypeScript 泛型函数参数和返回类型推断
【发布时间】:2020-01-23 06:19:16
【问题描述】:

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

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

【问题讨论】:

标签: typescript typescript-generics


【解决方案1】:

在第一个中,K 是明确定义的。所以,当你传递name 时,Typescript 可以推断出类型。但是在第二个中,getProperty2 函数需要任何 keyof T。所以,返回类型变成了string | number(如果你给obj添加更多的key,这会变得更复杂)。这就是为什么 Typescript 不确定你会得到哪一个。

您可以通过使用as 来解决此问题,因为您确信您会得到string 作为回报。

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

【讨论】:

  • 但是 TypeScript 怎么能推断出getPropertyreturn 类型呢?我找到TypeScript官方文档,他们已经明确定义了 return 类型,看到这个链接TypeScript official index type,他们的代码是function getProperty&lt;T, K extends keyof T&gt;(o: T, propertyName: K): T[K] { return o[propertyName];}
  • 他们也不需要定义返回类型。您可以 !check this out Typescript 可以这样做,因为您传递了密钥的名称。从那时起,K 变为 string
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 2016-12-05
  • 2016-11-01
  • 1970-01-01
  • 2020-03-11
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多