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

时间:2017-09-27 01:33:51

标签: 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]);
}

我理解keyof如何在对象T上生成所有已知公共属性名称的并集,但我并不完全理解extends扮演的角色。我明白K必须是T的有效属性,但为什么extends被使用而不是其他?此外,是否可以在Typescript中扩展联合,或者这更像是泛型的语义?

感谢。

1 个答案:

答案 0 :(得分:3)

在此上下文中,关键字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>("");

在您的示例中,K extends keyof T表示K被约束为keyof T。换句话说,这意味着您的想法 - K是一个被限制为T的属性名称的字符串。

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