澄清索引类型查询运算符和扩展关键字

Wil*_*arp 5 typescript

我正在阅读有关 Typescript 中高级类型的文档(在这里找到:https ://www.typescriptlang.org/docs/handbook/advanced-types.html ),它提到了索引查询运算符,并给出了以下示例:

function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
  return names.map(n => o[n]);
}
Run Code Online (Sandbox Code Playgroud)

我了解如何keyof在对象上生成所有已知公共属性名称的联合,T但我不完全了解所扮演的extends角色。我知道它说这K必须是一个有效的属性,T但为什么extends使用而不是其他东西?另外,是否可以在 Typescript 中扩展联合,或者这更像是泛型特有的语义?

谢谢。

Dav*_*ret 5

extends在这种情况下,关键字是一种在类型参数上添加约束的方法。

给出这个简单的例子,你会看到编译器只允许你传入符合Person接口的对象:

interface Person {
    name: string;
}

function logAndReturnPerson<T extends Person>(person: T) {
    console.log(person.name);
    return person;
}

// ok
const result1 = logAndReturnPerson<Person>({ name: "David" });
// not ok, string does not satisfy constraint of Person
const result2 = logAndReturnPerson<string>("");
Run Code Online (Sandbox Code Playgroud)

在您的示例中,K extends keyof T意味着K限制为keyof T. 换句话说,这意味着您所想的——K是一个字符串,它被限制为 的属性名称T

是的,这是泛型特有的语义。请注意,可以在约束中使用联合类型。

  • @Willwsharp 查看“通用约束”部分:https://www.typescriptlang.org/docs/handbook/generics.html (3认同)