Как динамически присваивать значения свойствам объекта в Typescript?

#typescript #typescript-typings #typescript-generics #typeof #keyof

#typescript #typescript-типизации #typescript-generics #typeof #keyof

Вопрос:

У меня есть эти два типа:

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

Теперь я хочу объявить переменную type D , но я не хочу присваивать каждому arbitraryPropertyName одно за другим, вот так:

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

Есть ли способ динамически присваивать значение каждому свойству?

Ответ №1:

В общем случае вы не можете перейти от a type к переменной. В этом случае type ArbitraryPropertyName происходит из переменной arbitrary , поэтому мы можем использовать Object.keys(arbitrary) для получения всех имен в type .

В какой-то момент для создания объекта потребуется некоторое as утверждение, поскольку Object прототип функционирует Object.keys и Object.entries используется string в качестве типа для ключей вместо конкретных ключей из типа объекта.

Вот один из способов: (требуется библиотека: es2019)

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

Ссылка на игровую площадку Typescript

Возможно, вы захотите вернуть более конкретный тип (подмножество 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
 

Ссылка на игровую площадку Typescript