Typescript: Deklarera typ av en keyof för en generisk objektparameter
Jag försöker skapa en anpassad sorteringsfunktion för en array av objekt av olika typer. Jag skulle vilja att funktionen är tillräckligt generell för att fungera för många typer som innehåller minst en strängegenskap.
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
}
Kan jag deklarera typen av parametern 'field' som keyof för ett objekt som är av typen string?
Till exempel kommer funktionen ovan inte att fungera om Record har en nummer-egenskap eftersom localCompare är en strängfunktion.
interface Record {
id: string
name: string
user: number
}
Lösning
Detta fungerade för mig, redigerat från caTS svar:
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) => ...
}
Svar #1
Du kan definiera en typ för att få nycklarna som har en specifik typ på detta sätt:
type KeysOfType<O, T> = {
[K in keyof O]: O[K] extends T ? K : never
}[keyof O];
och sedan kan du använda det i din funktion:
const sortStr = (field: KeysOfType<MyRecord, string>, reverse: boolean) => {
Observera att jag döpte om Record till MyRecord eftersom Record redan är en inbyggd typ.
Lekplats
