Typescript将数组转换为具有指定类型的对象

时间:2018-01-24 18:09:46

标签: typescript

我试图将一个类数组转换为一个具有类名作为对象键的对象。所以;

我有一系列课程:

const renderers = [
    Battery,
    Kind
]

我想转换为像这样的对象:

{
  Battery: Battery,
  Kind: Kind
}

为此,我使用reduce来获取对象:

const convertedObject = renderers.reduce((acc, renderer) => {
    acc[renderer.name] = renderer;
    return acc;
}, {});

所以convertedObject现在的类型为{}。我希望此类型为{ Battery: typeof Battery, Kind: typeof Kind}(这样我就可以使用keyof typeof创建一个包含字符串值的类型。)

我知道如何通过type RendererType = typeof renderers[0]来获取数组的类型,这会让我typeof Battery | typeof Kind。然后在减速器中我可以这样做:

renderers.reduce<{[x: string]: RendererType }>((acc, renderer) => {
    acc[renderer.name] = renderer;
    return acc;
}, {});

现在,convertedObject的类型为{ [x: string]: typeof Battery | typeof Kind } ok 。但我宁愿它是我之前描述的对象。

我试着做

renderers.reduce<{[K in keyof RendererType]: RendererType }>((acc, renderer) => {
    acc[renderer.name] = renderer;
    return acc;
}, {});

然后我得到{ prototype: typeof Battery | typeof Kind }

有没有办法以某种方式获得我需要的Typescript类型?

2 个答案:

答案 0 :(得分:1)

阵列是否固定为两个?如果是,那么可能会做到以下几点:

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 

答案 1 :(得分:0)

我担心你想要的是不可能将数组转换为具有属性名称类型名称的对象类型,至少不能再次手动指定名称(如另一个答案所示)。你可以从另一端开始,有一个符合所需形状的对象并将其转换为数组:

const renderersObject = {
    Battery, // This is the same as Battery: Battery, so we don't have o specify it twice
    Kind
};

然后你可以使用Object.value(或者为它填充polyfill)将它转换为数组

const renderers = Object.values(renderersObject);