首页 > 解决方案 > Typescript Conditional Types 结合映射类型文档示例说明

问题描述

我试图了解 TypeScript 2.8 中引入的条件类型并阅读相同的文档。

下面的例子可以在下面的链接中看到 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

该部分中有一个示例:

type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];

我了解 { [K in keyof T]: T[K] extends Function ? K : never } 它选择功能类型的所有键的部分。但我不明白为什么最后有一个数组类型的语法 [keyof T] 它在那里做什么?为什么需要它?

提前致谢。

标签: typescripttypescript2.0typescript-generics

解决方案


它被称为查找类型

使用数组访问语法,我们可以获得传入的所有属性类型的联合。

({ a: string, b: number, c: object })['a' | 'b'] // -> string | number

让我们看一个例子,其中 T 是:

{
  a: () => void,
  b: () => void,
  c: string
}

的预期结果FunctionPropertyNames<T>'a' | 'b'

映射类型产生如下对象类型:

{
  a: 'a',
  b: 'b',
  c: never
}

但这不是我们想要的,我们需要属性名称作为联合类型。这就是查找类型的用武之地。

在示例中,我们T基本上使用了所有键:

({ a: 'a', b: 'b', c: never })['a' | 'b' | 'c'] // -> 'a' | 'b' | never

这会返回'a' | 'b' | never并且never无关紧要,因此 TypeScript 将其删除,我们得到'a' | 'b'


推荐阅读