我正在阅读有关 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
上所有已知公共(public)属性名称的联合,但我不完全了解 extends
的作用> 播放。我知道这是说 K
必须是 T
的有效属性,但为什么使用 extends
而不是其他东西?此外,是否可以在 Typescript 中扩展联合,或者这更多是泛型特有的语义?
谢谢。
最佳答案
在此上下文中,关键字 extends
是一种对类型参数添加约束的方法。
给出这个简单的例子,你会看到编译器只允许你传入符合Person
接口(interface)的对象:
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
的属性名称。
是的,这是泛型特有的语义。请注意,可以在约束中使用联合类型。
关于typescript - 澄清索引类型查询运算符和扩展关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438142/