我正在阅读关于打字稿中的高级类型的文档(在此处找到: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中扩展联合,或者这更像是泛型的语义?
感谢。
答案 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
的属性名称的字符串。
是的,这是一个特定于泛型的语义。请注意,可以在约束中使用联合类型。