Почему я не могу так описать интерфейс?

Рейтинг: 0Ответов: 1Опубликовано: 10.01.2023

Почему я не могу указать, что в объекте есть ключи id, _id со значением типа строки и какие-то еще ключи со значением объекта?

interface ITest
{
    _id: string;
    id: string;
    [ keyContent: string ]:
    {
        [ keyText: string ]: string;
    };
}

Свойство "_id" типа "string" не может быть назначено типу индекса "string" "{ [keyText: string]: string; }". ts(2411)

Свойство "id" типа "string" не может быть назначено типу индекса "string" "{ [keyText: string]: string; }". ts(2411)

Пример данных:

const test = [
    {
        "_id": "63a45f54f21c59fef23a637b",
        "id": "63a45f54f21c59fef23a637b",
        "test2":
        {
            "value1": "stackoverflow",
            "value2": "test"
        },
        "test":
        {
            "title": "My next"
        }
    }
];

Ответы

▲ 1Принят

Потому что вот этим объявлением

    [ keyContent: string ]:
    {
        [ keyText: string ]: string;
    };

вы указали, что значения вашего типа, индексируемого строкой, должны иметь тип

    {
        [ keyText: string ]: string;
    };

каждый. И получается противоречие, когда вы также говорите, что id и _id должны быть строками.

Если вы имеете в виду, что вам нужен тип, где все значения - это вложенные объекты строка-строка, но при этом в корне лежат строковые id и _id, то можете попробовать сделать например так:

type TTest = {id: string, _id: string} & {[P: string]: Record<string, string> | string}

TS Playground.