Почему это неправильно? У меня были похожие проблемы с этим, и я никогда не понимал этого. Когда бы я ни делал это:

    type dataType = {
        [key: string]: string | Record<string, string>;
    };

    const rawData = [
        {
            name: 'XXXX',
            commission: 'XXXX',
            psc: 'XXX XX',
            ico: 'XXXXXXXX',
            address: 'XXXXXXX',
            city: 'XXXXXXXXXXX',
        },
    ];
    const createData = ({ name, commission, ico, address, psc, city }: dataType) => {
        return { name, commission, legal: { name, ico, address, city: `${psc} ${city}` } };
    };

    const rows: dataType[] = [createData(rawData[0])];

Теоретически это должно работать нормально, не так ли? DataType - это тип объекта с любым ключом, который является строкой со значением строки или другого объекта. Почему это не работает?

0
Filip 15 Ноя 2020 в 17:52

2 ответа

Лучший ответ

Ваш createData не должен принимать объект dataType в качестве аргумента. Как вы это написали, name, ico и address могут иметь тип Record<string, string>, что соответствует подписи

const createData: ({ name, commission, ico, address, psc, city }: dataType) => {
    name: string | Record<string, string>;
    commission: string | Record<string, string>;
    legal: {
        name: string | Record<string, string>;
        ico: string | Record<...>;
        address: string | Record<...>;
        city: string;
    };
}

Эти записи внутри объекта legal недействительны, когда вы пытаетесь присвоить результат переменной dataType.

Вместо этого используйте

const createData = ({ name, commission, ico, address, psc, city }: Record<string, string>) => …

Который является правильным типом, подходящим для вашего rawData. (Вы можете быть более точными и определить интерфейс с точными свойствами).

3
Bergi 15 Ноя 2020 в 14:59

введите описание изображения здесь

Имя причины может быть строкой | Запишите , чтобы legal.name в возвращаемом типе мог быть строкой | Record , что означает, что тип допустимого должен быть Record >;

Ваш {{x0}} не должен принимать объект {{x1}} в качестве аргумента. Как вы написали его, {{x2}}, {{x3}} и {{x4}} и {{x4}} могут быть

Лично я не рекомендую вам так писать.

type DataType = {
  name: string,
  commission: string,
  psc: string,
  ico: string,
  address: string,
  city: string,
};

type AnotherDataType = {
  name: string,
  commission: string,
  legal: Partial<DataType>
}

Может быть лучше.

0
Zotille 15 Ноя 2020 в 15:48