首页 > 解决方案 > 将字符串数组转换为字典

问题描述

我希望能够将字符串数组转换为字典,其中传入的字符串成为对象的键(并且值设置为true):

// obj = { foo: true, bar: true );
const obj = toObject("foo", "bar");

这在运行时使用 JS 非常简单,但我希望将类型保留在 TS 中,这非常具有挑战性。这是一个在运行时工作但最终以all. 呸。

function toObject<T extends readonly string[]>(...keys: T) {
  return keys.reduce((acc, k) => {
    acc[k] = true;
    return acc;
  }, {} as any);
}

我们的值为零,但它仍然比在减速器中all不说明要好。as any至少我们可以在运行时索引字典。如果我们不理会它,该类型将是一个空对象。相反,我需要的是某种将字符串数组转换为字符串并集的方法。一旦我有了,我可以简单地输入减速器的初始状态:

{} as Record<UnionOfStrings, true>;

也就是说,我无法弄清楚如何进行这种转换。

有谁知道怎么做?

标签: typescripttypescript-typingstypescript-generics

解决方案


您实际上并不需要为此使用.reduce它,因为它实际上并不比仅使用普通的for循环简单得多。这是我使用循环编写的实现,但如果您愿意,for也可以使用它来编写。.reduce

function toObject<T extends readonly string[]>(...keys: T): Record<T[number], true> {
    const obj: Record<string, true> = {};

    for (const key of keys) {
        obj[key] = true;
    }

    return obj;
}

注意返回类型:Record<T[number], true>. 我想这就是你要找的。


推荐阅读