typescript - Er generisk registernøkkel mulig?
Er det mulig å returnere en Record med en generisk nøkkel? Typing tillater det, men implementering ser ikke ut til å være mulig.
function foo<K extends string>(key: K): Record<K, string> {
return {
[key]: "foo"
}
}
Feil :
Type '{ [x: string]: string; }' is not assignable to type 'Record<K, string>'.(2322)
Svar #1
Den raske løsningen er å hevde at objektet du returnerer er av riktig type.
function foo<K extends string>(key: K): Record<K, string> {
return {
[key]: "foo"
} as Record<K, string>
}
Grunnen til at dette er nødvendig er fordi TypeScript erkjenner muligheten for at typen K kan være bredere enn bare den bokstavelige strengen key (K kunne være string eller en union av strenglitteraler). Hvis det er tilfelle, vil ikke objektet du returnerer faktisk oppfylle returtypen fordi det ikke ville ha en verdi for hver nøkkel K.
Det er for øyeblikket ikke mulig å si at en generisk må være en enkelt bokstavelig streng, så litt finpussing med as er nødvendig.
