我正在阅读有关 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 中扩展联合,或者这更像是泛型特有的语义?
谢谢。
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
。
是的,这是泛型特有的语义。请注意,可以在约束中使用联合类型。
归档时间: |
|
查看次数: |
353 次 |
最近记录: |