我正在嘗試為不同型別的物件陣列創建自定義排序函式。我希望該函式足夠通用,以適用于包含至少一個字串屬性的許多型別。
interface Record {
id: string
name: string
}
const sortStr = (field: keyof Record, reverse: boolean) => {
return (a: Record, b: Record) =>
a[field] !== "" && b[field] !== ""
? (reverse ? -1 : 1) *
a[field].localeCompare(b[field], undefined, { sensitivity: "base" })
: a[field] !== "" && b[field] === ""
? -1
: a[field] === "" && b[field] !== ""
? 1
: 0
}
我可以將“欄位”引數的型別宣告為字串型別的任何物件的鍵嗎?
例如,如果 Record 具有 number 屬性,則上面的函式將不起作用,因為 localCompare 是一個字串函式。
interface Record {
id: string
name: string
user: number
}
解決方案
這對我有用,根據貓的回答編輯:
type KeysOfType<O, T> = {
[K in keyof O]: O[K] extends T ? K : never
}[keyof O]
const sortStr = (field: KeysOfType<any, string>, reverse: boolean) => {
return (a: any, b: any) => ...
}
uj5u.com熱心網友回復:
您可以定義一個型別來獲取具有特定型別的鍵,如下所示:
type KeysOfType<O, T> = {
[K in keyof O]: O[K] extends T ? K : never
}[keyof O];
然后你可以在你的函式中使用它:
const sortStr = (field: KeysOfType<MyRecord, string>, reverse: boolean) => {
請注意,我重命名Record
為MyRecord
因為Record
已經是內置型別。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529966.html
標籤:打字稿