类型定义中的右括号后[keyof T]是什么意思?

德米特里

在此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]键)在大括号后面是什么意思吗?是否有有关此语法的文档?

TJ人群

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"因为这是TPart)唯一具有函数类型的键。没有这个[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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章