在此URL上查看打字稿文档https://www.typescriptlang.org/docs/handbook/advanced-types.html
type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
有人可以给我解释一下[[T]键)在大括号后面是什么意思吗?是否有有关此语法的文档?
keyof T
表示该T
类型的有效键(您可能知道)。当您拥有[x]
接口或联合类型之后,它将使用名称选择属性/成员的类型x
。例如(游乐场链接):
interface Example {
a: number;
b: string;
}
type E1 = Example["a"];
/*
type E1 = number;
*/
据我所知,这些“查找类型”只记载了打字稿2.1发行说明在这里:
keyof
和查找类型在JavaScript中,使用以属性名称作为参数的API是相当普遍的,但是到目前为止,尚无法表达这些API中发生的类型关系。输入索引类型查询或
keyof
;索引类型查询keyof T
产生T的允许属性名称的keyof T
类型。类型被视为字符串的子类型。例
interface Person { name: string; age: number; location: string; } type K1 = keyof Person; // "name" | "age" | "location" type K2 = keyof Person[]; // "length" | "push" | "pop" | "concat" | ... type K3 = keyof { [x: string]: Person }; // string
双重访问是索引访问类型,也称为查找类型。从句法上讲,它们看起来完全像元素访问,但是被写为类型:
例
type P1 = Person["name"]; // string type P2 = Person["name" | "age"]; // string | number type P3 = string["charAt"]; // (pos: number) => string type P4 = string[]["push"]; // (...items: string[]) => number type P5 = string[][0]; // string
您可以将此模式与类型系统的其他部分一起使用,以进行类型安全的查找。
function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key]; // Inferred type is T[K] } function setProperty<T, K extends keyof T>(obj: T, key: K, value: T[K]) { obj[key] = value; } let x = { foo: 10, bar: "hello!" }; let foo = getProperty(x, "foo"); // number let bar = getProperty(x, "bar"); // string let oops = getProperty(x, "wargarbl"); // Error! "wargarbl" is not "foo" | "bar" setProperty(x, "foo", "string"); // Error!, string expected number
的主要部分FunctionPropertyNames<T>
产生了一个带有never
-typed成员的接口,用于所有T
非函数类型的属性,以及带有-typed成员的原始成员类型。例如,如示例中所示,如果您这样做:
interface Part {
id: number;
name: string;
subparts: Part[];
updatePart(newName: string): void;
}
type T1 = FunctionPropertyNames<Part>;
T1
最终"updatePart"
因为这是T
(Part
)唯一具有函数类型的键。没有这个[keyof T]
部分,您将获得与never
成员的接口(操场链接):
type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
type Example<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}/* Same as above, but without [keyof T] here*/;
interface Part {
id: number;
name: string;
subparts: Part[];
updatePart(newName: string): void;
}
type T1 = FunctionPropertyNames<Part>;
/*
type T1 = "updatePart"
*/
type E1 = Example<Part>;
/*
type E1 = {
id: never;
name: never;
subparts: never;
updatePart: "updatePart";
}
*/
它[keyof T]
是FunctionPropertyNames
提供函数类型属性的名称的部分,而不是函数类型属性本身(和-类型的属性never
)的名称。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句