Typescript - Hur man får nycklar bakom specifika värden från ett objekt
Jag har ett superenkelt användningsfall. Jag vill ha en funktion pluckOnlyStringValues på vilken jag skickar ett objekt obj och en key och jag vill försäkra mig om att jag endast kan skicka sådana nycklar vars värden är string. På så sätt att pluckOnlyStringValues alltid returnerar string.
För målet försöker jag implementera en typ-hjälpare PickKeysByValue, men det verkar inte fungera...
type PickKeysByValue<T extends object, ValueTypes> = {
[K in keyof T]-?: T[K] extends ValueTypes ? K : never;
}[keyof T];
// Working
type GetKeysWithStringValues = PickKeysByValue<
{ a: string; b?: string; c: number | undefined; d: () => 4 },
string
>;
// Working
type GetStringValues = { a: string; b?: string; c: number | undefined; d: () => 4 }[GetKeysWithStringValues]
// Not working
const pluckOnlyStringValues = <O extends { a: string }>(
obj: O,
key: PickKeysByValue<O, string>,
): string => {
return obj[key];
};
Svar #1
Om du ändrar begränsningen av O till Record<string, any>, kommer TypeScript att veta att O kan indexeras med en string.
const pluckOnlyStringValues = <O extends Record<string, any>>(
obj: O,
key: PickKeysByValue<O, string>,
): string => {
return obj[key];
};
Svar #2
Baserat på din beskrivning,..
Du kan göra detta med en hjälpartyp, StringKeys, detta skulle då bara returnera nycklar som är strängtyper.
const test = {
aNumber: 12,
aString: 'ABC'
};
type StringKeys<T extends object> = {
[K in keyof T]: T[K] extends string ? K : never
}[keyof T];
function pluckString<T extends object>(obj:T, key:StringKeys<T>) {
return obj[key];
}
pluckString(test, 'aString') //ok
pluckString(test, 'aNumber'); //error
Lekplats med återkomst
