#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