Быстрое решение для TS1337: An index signature parameter type cannot be a union type. Consider using a mapped object type instead

Я столько раз напарывался на эту проблему, что уже нет мочи. Положу сюда решение и буду возвращаться к нему.

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

3 лайка