2017-09-27 71 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