Тип ‘{ label: строка; значение: строка; }’ не содержит следующих свойств из type в Typescript react js

#reactjs #typescript

#reactjs #typescript

Вопрос:

Привет, я получаю некоторую ошибку типа данных в typescript при получении первой записи массива. Я инициализирую данные следующим образом —

 const ABData= testData.B.map(({ id, name }) => ({
        label: translateFn!(id),
        value : name
    }));

const newData: PropsInterface = {
        displayData: ABData[0]
    };
  

Ниже приведены мои данные —

 export const testData: PropsInterface = {
    A: [
        { value: "All", key: "All" },
    ],
    B: [
        {id: "0", name: ""},
        {id: "100000008472", name: "Y6DC"}
    ],
    C: "100000008472",
    D: [{id: "0", name: "None"}],
    E: [
        {value: "", key: "None"},
        {value: "A", key: "Test"},
    ]

}
  

Вот мой интерфейс —

 export interface PropsInterface {
    A: Array<First>;
    B: Array<Second>;
    C: string;
    D: Array<Second>;
    E: Array<First>;
}

export interface First{
    key: string;
    value: string;
}

export interface Second{
    id: string;
    name: string;
}
  

Я получаю ошибку в displayData, если я пытаюсь получить первые данные, используя 0-й индекс.

ошибка — Type '{ label: string; value: string; }' is missing the following properties from type 'Second[]': length, pop, push, concat, and 26 more.

Как я могу устранить эту ошибку?

Комментарии:

1. Вы пытались указать A, B, C, D и E как необязательные?

2. @kunquan Я буду отправлять данные A, B, C, D, E в реквизитах. Поэтому нужно сделать его необязательным. Я думаю, проблема со стороны typescript.

3. Ну, я думаю, проблема в том, что PropsInterface требуются все A, B, C, D и E, но newData имеет только

4. @kunquan Да, я отправил все данные, но прямо сейчас я получаю ошибку в B. Итак, я отобразил только эти данные, но да, я уже отправляю все данные, то есть A, B, C, D, E.

Ответ №1:

Прежде всего, давайте проверим ваш PropsInterface :

 // I made A, C, D optionals since the problem here is B as you say first
export interface PropsInterface {
  A?: Array<First>;
  B: Array<Second>;
  C?: string;
  D?: Array<Second>;
  E?: Array<First>;
}
  

Затем вы First и Second интерфейсы:

 export interface First {
  key: string;
  value: string;
}

export interface Second {
  id: string;
  name: string;
}
  

Теперь данные, которые вы предоставляете:

 export const testData: PropsInterface = {
  A: [{value: 'All', key: 'All'}],
  B: [
    {id: '0', name: ''},
    {id: '100000008472', name: 'Y6DC'}
  ],
  C: '100000008472',
  D: [{id: '0', name: 'None'}],
  E: [
    {value: '', key: 'None'},
    {value: 'A', key: 'Test'}
  ]
};
  

До сих пор все в порядке, но проблема возникает в вашей .map функции:

 const ABData = testData.B.map(({id, name}) => ({
  label: translateFn!(id),
  value: name,
}));
  

Давайте поговорим в терминах чистого объекта. Вы присваиваете {label: string, value: string}[] переменной значение type ABData . Затем вы присваиваете ABData newData значение, которое имеет тип PropsInterface . Вы сообщаете (TS), что newData это тип PropsInterface , но у этого интерфейса нет displayData свойства.

 const newData: PropsInterface = {
  displayLabel: ABData[0],
};
  

Итак, давайте изменим имя displayData prop на B .

 const newData: PropsInterface = {
  B: ABData[0]
};
  

Ошибка исчезла, но у нас все еще есть проблема Type '{ label: string; value: string; }' is missing the following properties from type 'Second[]': length, pop, push, concat, and 26 more.ts(2740) . Это связано с тем, что мы присваиваем элемент массива, а не сам массив. Итак, давайте изменим новые данные следующим образом:

 const newData: PropsInterface = {
  B: ABData
};
  

Эта ошибка исчезла, но у нас появилась новая проблема Type '{ label: string; value: string; }[]' is not assignable to type 'Second[]'. , поэтому давайте ее исправим. Second имеет id и name , но мы пытаемся присвоить label и value . Для этого давайте изменим .map функцию следующим образом:

 const ABData = testData.B.map(({id, name}) => ({
  id: translateFn!(id),
  name: name,
}));
  

И все, мы исправили все ошибки. Конечный результат:

 export const testData: PropsInterface = {
  A: [{value: 'All', key: 'All'}],
  B: [
    {id: '0', name: ''},
    {id: '100000008472', name: 'Y6DC'}
  ],
  C: '100000008472',
  D: [{id: '0', name: 'None'}],
  E: [
    {value: '', key: 'None'},
    {value: 'A', key: 'Test'}
  ]
};

export interface PropsInterface {
  A?: Array<First>;
  B: Array<Second>;
  C?: string;
  D?: Array<Second>;
  E?: Array<First>;
}

export interface First {
  key: string;
  value: string;
}

export interface Second {
  id: string;
  name: string;
}

const ABData = testData.B.map(({id, name}) => ({
  id: translateFn!(id),
  name: name
}));

const newData: PropsInterface = {
  B: ABData
};
  

Комментарии:

1. Я согласен с вашей точкой зрения, но я хочу передать только первые данные массива, т.Е. B: ABData [0] . Итак, как я могу этого добиться. Я не хочу передавать весь массив, я просто хочу передать первые данные массива.

2. В этом случае вы можете изменить B свое свойство PropsInterface на B: Second вместо использования массива. В случае, если вы хотите сохранить использование массива, вы можете быть хитрыми и выполнить B: [ABData[0]] newData присваивание, таким образом, вы сохраните использование Second[] и назначите только первый элемент ABData