Typescript条件类型与映射类型文档说明示例结合在一起

时间:2019-09-13 11:39:08

标签: typescript typescript2.0 typescript-generics

我试图理解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] 在那里做什么?为什么需要它?

谢谢。

2 个答案:

答案 0 :(得分:1)

它称为lookup type

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

({ 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'

答案 1 :(得分:1)

首先假设该代码段仅位于以下

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

没有数组访问器。因此,基本上,非功能映射到never,而功能映射到相应类型的键,即它们的功能名称。

这意味着

type Foo = FunctionPropertyNames<{
    bar: string;
    baz: number;
    boo(): void;
    ping(a: number): string;
}>;

type Foo = {
    bar: never;
    baz: never;
    boo: "boo";
    ping: "ping";
};

一样。当我们最终使用数组访问器并使用T使用[keyof T]中的键来访问所有类型的属性时(此时实际上是全部),我们得到了所有类型的联合,而没有{{1} },因为never总是被丢弃。