Typescript: Как определить интерфейсы для вложенных объектов?

Предположим, у меня есть полезная нагрузка JSON, которая анализирует что-то вроде этого:

{
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        }
    }
}

Как бы я установил определение интерфейса Example для моделирования того, что значение свойства items является объектом, чьими ключами являются строки и значения которых определяются интерфейсом Item:

export interface Example {
    name: string;
    items: ???;

}

export interface Item {
    id: number;
    size: number;
}

Ответ 1

Typescript позволяет вам добавить тип для ключей объекта с помощью синтаксиса [key: string].

Как указано в документации, они называются индексируемые типы:

Индексируемые типы имеют индексную подпись, которая описывает типы, которые мы можем использовать для индексации в объект, а также соответствующие типы возвращаемых данных при индексировании.

В вашем случае вы должны использовать следующее:

export interface Item {
    id: number;
    size: number;
}

export interface Example {
    name: string;
    items: {
        [key: string]: Item
    };
}

Для справки, ссылка