我试图理解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]
在那里做什么?为什么需要它?
谢谢。
答案 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
总是被丢弃。