typescript - 为什么 TypeScript 中的 keyof word 在 2 `type defination` 秒内表现不同?

标签 typescript

为什么res1不能像res2那样知道它的类型是number

interface P {
  name: string;
  age: number;
}
const people: P = {
  age: 30,
  name: 'Peter',
};

type T = keyof P
type Fn1 = (p: P, t: T) => P[T]
type Fn2 = <P, T extends keyof P>(p: P, t: T) => P[T]

const fn1: Fn1 = (p, t) => {
  return p[t]
}
const fn2: Fn2 = (p, t) => {
  return p[t]
}

const res1 = fn1(people, 'age');
const res2 = fn2(people, 'age');

最佳答案

首先让我们更改 fn2 的定义所以我们可以理解类型参数的重要性。我们不会将自己与 T 混淆。这是 keyof P .

type Fn2 = <P, Tx extends keyof P>(p: P, t: Tx) => P[Tx]

函数的通用版本始终将通用类型参数作为现有函数的额外参数,以帮助编译器解析类型。 fn1没有类型参数,在这种情况下编译器无法区分 fn1(people, 'age') and fn1(people, 'name') .

在编译时扩展 fn1, (p: P, key: "age" | "name") => p['age' | 'name']编译器没有可用的通用参数来存储传递的 key 。类型参数就像变量,编译器可以存储在进一步编译中有用的信息。

但是对于 fn2,fn2(people, 'age')的类型参数如下,

<P, 'age'>(p: P, 'age': 'age' | 'name') => p['age'] ,这里Tx因为通用参数是编译器在编译时知道的“年龄”,它可以将此信息与帮助编译器解析的函数一起存储 p['age'] as数`。

关于typescript - 为什么 TypeScript 中的 keyof word 在 2 `type defination` 秒内表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58908691/

相关文章:

javascript - 扩展 TypeScript 的控制台界面

javascript - 当属性是可选的时,如何在 Typescript 中解构对象?

typescript - []' is missing the following properties from type ' Promise<Cats[]>' : then, catch, [Symbol.toStringTag], 最后是 ts(2739)

typescript - 在 Typescript 中,当我使用 require() 导入时,如何让它理解类型?

javascript - TypeScript 泛型创建实例

javascript - 如何使用angular 6和bootstrap 3.3.7创建带有复选框列表的可折叠/可展开/树结构

angular - Angular 2 中 Zone.js 的用途是什么

angular - startWith ('' ) typescript 代码有什么作用?

javascript - 如何在 React 中使网站主题在刷新时保持不变?

javascript - 如何停止 array.filter() 函数