“An index signature parameter type cannot be a union type.” – what should I use instead?

A mapped object type operates on a set of singleton types and produces a new object type where each of those singletons is turned into a property name.

For example, this:

type Foo = {
    [K in "hello" | "world"]: string
};

would be equivalent to

type Foo = {
    "hello": string;
    "world": string;
};

Keep in mind that a mapped object type is a distinct type operator – that syntax in the braces can’t be used in interfaces, or object types with other members. For example

interface Foo {
    [K in "hello" | "world"]: string; // ❌
}

produces the following error:

A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type.

Mapped object types are useful for a lot of different things. Read more here: https://www.typescriptlang.org/docs/handbook/2/mapped-types.html

Leave a Comment