我通過玩TypeScript及其型別系統獲得了一些樂趣--這并不是什么重要的事情,但也許你們中的一些人覺得這和我一樣有趣或好玩。
由于我經常發現自己通過上述物件的屬性對陣列進行排序,因此我想,"為什么不實作一個 sortBy 函式呢?"。
Array.prototype。 sortBy = function <T, P extends keyof T> (
this: T[],
compareFn: (a: unknown, b: unknown) => number,
key。P
): T[] {
return this. sort((a, b) => compareFn(a[key], b[key]))。
};
使用方法:
interface A {
keyA: string;
keyB: 數字。
}
const arr: A[] = [
{ keyA: "a"/span>, keyB: 42 },
{ keyA: "b", keyB: 1337 },
{ keyA: "c"/span>, keyB: -1 },
];
arr.sortBy((a: number, b: number) => b - a, "keyB" )。
這個實作是可行的,而且我認為這很酷,因為它甚至可以將鍵的串列作為一個型別變數--據我所知,這種行為在C#中是不可能的,例如。
還有最后一件事我想清理一下 - 那些是用于比較器的未知型別。編譯器無法在運行時提前捕捉到任何錯誤,這可能是很危險的。是否有可能告訴TS "T中的屬性P的型別"?
我想象著類似于 K extends typeof P in T 或者 K extends typeof T[P]。
如果這是可行的,我甚至可以在函式宣告中添加子鍵,以便在物件樹的更深處搜索屬性。
PS:我知道這是個很有創意的問題,而且我認為K extends typeof T[P]在很多情況下根本沒有用。但是,玩弄代碼并對其進行討論是非常有趣的,而且可以加深對有關語言的理解。
uj5u.com熱心網友回復:
你所要做的就是參考鍵值。T[P]見:
Array.prototype。 sortBy = function <T, P extends keyof T> (
this: T[],
compareFn: (a: T[P], b: T[P]) => number,
key。P
): T[] {
return this. sort((a, b) => compareFn(a[key], b[key]))。
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330169.html
標籤:
上一篇:如果某個函式引數接收了List<List<Integer>>nums,那么nums是由LinkedList還是ArrayList實體化的?
