我想做一個像
function sortByKey<T>(items: T[], key: string): T[] {
return items.sort((a, b) => a[key] - b[key]);
}
我需要T[key]成為一個number,但我不知道如何表達。
如果我提前知道鑰匙,我顯然可以這樣做,{key: number}但這在這里行不通。
我嘗試了類似的方法,sortByKey<K>(items: {[k: K]: number}[], key: K)但這給出了"An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead."我查看映射型別的錯誤,但它們似乎沒有做我需要的事情。在 TypeScript 中這樣的事情可能嗎?
uj5u.com熱心網友回復:
您可能希望函式T在items元素的型別和 的型別中都是通用K的key。你可以限制 K是keylike( K extends PropertyKey)和約束T是有一個型別number的鍵值K(T extends Record<K, number>使用的Record<K, V>實用型):
function sortByKey<K extends PropertyKey, T extends Record<K, number>>(
items: T[],
key: K
): T[] {
return items.sort((a, b) => a[key] - b[key]);
}
你不能寫,{[k: K]: number}因為那是一個不能通用的索引簽名。但是您可以{[P in K]: number}使用映射型別撰寫。映射型別與索引簽名相似但不同;有關更多資訊,請參閱此答案。無論如何,Record<K, number>是 的別名{[P in K]: number},所以你越來越接近了。
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/405756.html
標籤:
上一篇:打字稿通用,如何?
