这是例子
这是操场
这是示例代码:
type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
interface Part {
id: number;
name: string;
subparts: Part[];
updatePart(newName: string): void;
}
type T1 = FunctionPropertyNames<Part>;
const myVar:T1 = 'updatePart'
我真搞不清楚[keyof T]
的部分type FunctionPropertyNames<T> = {...}[keyof T]
。这是我第一次看到这样的语法,但是我在文档中找不到任何有关此语法的信息。您能给我另一个使用它的例子吗?或者也许将我指向可以阅读的方向。或者也许对它如何工作有一个见解。
谢谢你,先生!
keyof T
是一个表达式,当T
作为对象时,其结果为的所有属性名称T
。例如:
type Thing = { fieldOne: string; fieldTwo: number };
type ThingFields = keyof Thing; // equivalent to: type ThingFields = "fieldOne" | "fieldTwo"
该FunctionPropertyNames<T>
实用程序令人困惑,但我们可以FunctionPropertyNames<Part>
逐步查看它的评估结果"updatePart"
。
type T1 = FunctionPropertyNames<Part>;
扩大 FunctionPropertyNames<Part>
type T1 = {
[K in keyof Part]: Part[K] extends Function ? K : never;
}[keyof Part];
扩展keyof
表达式
type T1 = {
[K in "id" | "name" | "subparts" | "updatePart"]: Part[K] extends Function ? K : never;
}["id" | "name" | "subparts" | "updatePart"];
评估条件表达式;索引类型 Part["updatePart"]
是唯一满足条件extends Function
并因此求值的索引类型K
,其关键updatePart
是 "updatePart"
。其他人的评价为never
。
type T1 = {
id: never;
name: never;
subparts: never;
updatePart: "updatePart";
}["id" | "name" | "subparts" | "updatePart"];
现在评估属性索引。
例如,{ fieldOne: "abc" }["fieldOne"]
将评估为"abc"
。而{ fieldTwo: never }["fieldTwo"]
评估为never
。
在我们的情况下,仅索引with的"updatePart"
计算结果不同于never
:字符串文字类型"updatePart"
。其他所有内容的计算结果均为never
。
type T1 = never | never | never | "updatePart";
简化为
type T1 = "updatePart";
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句