Typescript konvertera array till objekt med angiven typ
Jag försöker konvertera en array av klasser till ett objekt som har dess klassnamn som objektets nyckel. Så;
Jag har ett fält av klasser:
const renderers = [
Battery,
Kind
]
Och jag vill konvertera till ett objekt som:
{
Battery: Battery,
Kind: Kind
}
För att komma till det använder jag reduce för att få objektet:
const convertedObject = renderers.reduce((acc, renderer) => {
acc[renderer.name] = renderer;
return acc;
}, {});
Så convertedObject har nu en typ av {}. Jag vill att denna typ ska vara { Battery: typeof Battery, Kind: typeof Kind} (så att jag kan använda keyof typeof för att skapa en typ med strängvärdena.)
Jag vet hur man får typen av arrayen genom att göra type RendererType=typeof renderers[0], vilket ger mig typeof Battery | typeof Kind. Sedan kan jag i reduceraren göra detta:
renderers.reduce<{[x: string]: RendererType }>((acc, renderer) => {
acc[renderer.name] = renderer;
return acc;
}, {});
Så nu har convertedObject typen { [x: string]: typeof Battery | typeof Kind }, vilket är okej. Men jag vill hellre att det ska vara det objekt jag beskrev tidigare.
Jag försökte göra
renderers.reduce<{[K in keyof RendererType]: RendererType }>((acc, renderer) => {
acc[renderer.name] = renderer;
return acc;
}, {});
Men då får jag bara { prototype: typeof Battery | typeof Kind }
Finns det ett sätt att få typen som jag skulle behöva med Typescript på något sätt?
Svar #1
function b<K extends string>(...keys: K[]) : { [T in K]: string }
{
const init = {} as { [T in K]: string }
return keys.reduce((a, v) => ({ ...a, [v]: 'label'}), init);
}
var l = b('key1', 'key2');
console.log(l.key1, l.key2);
Kanske det är vad du vill.
Svar #2
Är arrayen fast till två? Om ja, då kan man förmodligen göra följande:
interface R { battery?: B; kind?: K; } // set fields as optional
renderers.reduce((acc, renderer) => {
acc[renderer.name] = renderer;
return acc;
}, {} as R); // strong type it manually
