#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()
метод может возвращать anundefined
. И поскольку вы используете?.
синтаксис для связывания свойств, он будет распространятьundefined
свойство. Вот почемуmType
переменная не может использоваться в качестве индекса: потому что это потенциальноundefined
. Если вы уверены, что он всегда будет определен, вы можете использовать!!.
синтаксис для доступа к свойствам.