Объект, возможно, является ‘неопределенным’ машинописным текстом в методе функции поиска

#javascript #typescript

#javascript #typescript

Вопрос:

Я действительно не знаю, как я могу зафиксировать ошибку. Может ли кто-нибудь помочь мне в этом?

Если у вас есть лучшее решение (если что-то выглядит лучше, это тоже здорово)

 interface Props {
    prevCases: Array<Case>
}

export function MyFunction(props) {
  const { prevCases } = this.props;
  const myType = prevCases               << Object is possibly 'undefined'.
    .find((case: Case) => case?.id === myId).resultItems
    ?.find((item: Item) => item.name === myPath)
    ?.type;
  console.log(ArrayA[myType]);    << Type 'undefined' cannot be used as an index type.
...
  

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

1. Если один из find них ничего не выдает, он вернет undefined, что означает, что ваш код застрял с неопределенным значением, которое вы сейчас пытаетесь передать как индекс в массив

2. Примечание, это нелегко прочитать. Я бы провел рефакторинг, чтобы упростить его для глаз. Компиляторы выполняют тяжелую работу, чтобы упростить ее на проводе, но вы больше читаете код, чем пишете его.

3. да, что-то было добавлено ? , и это трудно читать

4. Я добавил больше строк. Это помогает?

Ответ №1:

Попробуйте использовать упрощенный / читаемый код, чтобы читатели могли понять. 1 проблема в том, что вы не можете написать this.prop это ищет глобальную переменную, замените ее просто prop. Отладьте дальнейшую проблему с помощью блока try catch

 interface Props {
    prevCases: any[]
}
let myId = 1;
let myPath = 'abc';
function MyFunction(props : any[]) {
    try {
        const myType = props.filter(prop => prop ? prop['id'] === myId : false)
                            .filter(prop => prop ? prop['name'] === myPath : false); 

        myType.forEach(item => console.log(item['value']));
    }
    catch(Error){
        console.log(Error.message);
    }
}
MyFunction([null,{'id':2,'name':'abc','value':'b'},{'id':1,'name':'abc','value':'c'}]);
  

Ответ №2:

При использовании деструктурирования объекта значение свойства потенциально может быть undefined :

 const { prevCases } = this.props;
  

совпадает с:

 const prevCases = this.props.prevCases;
  

и Typescript не знает тип props , поэтому он не знает, что свойство prevCases существует, вам нужно явно указать Typescript, что props аргумент имеет тип Props . Для этого вам необходимо объявить тип в объявлении функции как таковой:

 export function MyFunction(props: Props) {
 // Your function body
}
  

и таким образом, Typescript будет использовать, что бы ни происходило, props параметр всегда будет иметь тип Props

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

1. Также эти ?. операторы могут возвращаться undefined .

2. Кроме того, использование .find() метода либо вернет значение, либо undefined (как объяснено там ), поэтому в вашем случае Typescript предположит, что .find() метод может возвращать an undefined . И поскольку вы используете ?. синтаксис для связывания свойств, он будет распространять undefined свойство. Вот почему mType переменная не может использоваться в качестве индекса: потому что это потенциально undefined . Если вы уверены, что он всегда будет определен, вы можете использовать !!. синтаксис для доступа к свойствам.