2017-09-27 37 views
2

我打算在打字稿上的高级类型的文档超过(这里找到:https://www.typescriptlang.org/docs/handbook/advanced-types.html),并将其提到的索引查询操作,获得以下为例:澄清索引类型查询运算符和extends关键字

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中扩展工会,或者这更多的是泛型特有的语义?

谢谢。

回答

2

在这种情况下,关键字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的字符串。

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

+0

作为后续问题,在Typescript文档中是否有更多讨论这个问题?我认为一些措辞可以消除任何混乱;尽管可能只有我的理解是有限的。 – Willwsharp

+1

@Willwsharp查看“通用约束”部分:https://www.typescriptlang.org/docs/handbook/generics.html –

+0

哦,我没有看到;非常感谢你。 – Willwsharp