Я столько раз напарывался на эту проблему, что уже нет мочи. Положу сюда решение и буду возвращаться к нему.
TLDR:
type Foo = 'a' | 'b';
type Bar = {[key in Foo]: any};
Я часто испольщую union type вместо string
для типов с ограниченным количеством возможных значений.
Например у меня есть идентификаторы табов. Я использую строки для описания. Но список строк ограничен количеством возможных идентификаторов. Тогда удобно описать тип как union конкретных значений строк. Теперь везде где я ожидаю идентификатор таба я использую union тип и избегаю кучи проблем с описками и переименованиями.
export type ITabIdentifier = 'reserved' | 'location-changes' | 'stock-location-changes'
А потом возникает необходимость создать map с ключами из этих табов. Если использовать решение влоб, то получается ошибка из заголовка поста:
const TABS_TRANSLATION_STRINGS: {[key: ITabIdentifier]: string} = {
// ...
}
А вот так работает отлично:
const TABS_TRANSLATION_STRINGS: {[key in ITabIdentifier]: string} = {
// ...
}
Источник с решением: Quick fix for 'unions can't be used in index signatures, use a mapped object type instead' · Issue #24220 · microsoft/TypeScript · GitHub