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 

Relaterade artiklar