1

我有这两种类型:

type ArbitraryPropertyName = keyof typeof arbitrary;
type D = { [k in ArbitraryPropertyName]: any };

现在我想声明一个 的变量type D,但我不想一个一个地分配每个 absolutePropertyName ,像这样:

const d: D = {
  arbitraryPropertyName1 = ...,
  arbitraryPropertyName2 = ...,
            ...,
  arbitraryPropertyNameN = ...
}

有没有办法为每个属性动态分配一个值?

4

1 回答 1

0

通常,您不能从 atype转到变量。在这种情况下,type ArbitraryPropertyName来自一个变量arbitrary,因此我们可以使用它Object.keys(arbitrary)来获取type.

创建对象在某些时候需要一些as断言,因为Object原型起作用Object.keysObject.entries用作string键的类型,而不是对象类型中的特定键。

这是一种方法:(需要lib:es2019)

const d: D = Object.fromEntries(
  Object.keys(arbitrary).map(
    key => ([key, "some default"])
  )
) as D; // have to assert

打字稿游乐场链接

D您可能希望根据值类型返回更具体的类型( 的子集)。

type DMap<T> = { [k in ArbitraryPropertyName]: T };

const makeD = <T extends any>(value: T): DMap<T> => {
  return Object.fromEntries(
    Object.keys(arbitrary).map(
      key => ([key, value])
    )
  ) as DMap<T>;
}

const d = makeD(0); // all values are 0

打字稿游乐场链接

于 2021-03-04T22:49:28.773 回答