В одном из моих проектов Angular у меня есть один интерфейс в userinterface.ts.
export interface Done {
wordlen: number;
word: string;
};
который я использую для заполнения массива
donearr: Done[] = [];
let fill:Done = { wordlen: 4, word: "word" }
this.donearr.push(fill)
Это работает до сих пор. Но когда я беру последний объект из массива для некоторой обработки, он выдает ошибку.
let v_last = this.donearr.pop()
console.info(v_last) // this displays the array content
console.info(v_last.wordlen) // this gives error.
// 'v_last' is possibly 'undefined'.ts(18048)
// let v_last: Done | undefined
Я пробовал let v_last: Done = this.donearr.pop()
, но это тоже выдает ошибку.
Type 'Done | undefined' is not assignable to type 'Done'.
Type 'undefined' is not assignable to type 'Done'.ts(2322)
Где я ошибаюсь?
TypeScript говорит, что pop может вернуть неопределенное значение, поэтому нам нужно использовать проверку типобезопасности ?.
, чтобы она работала, даже если значение не определено.
let v_last: Done | undefined = this.donearr.pop();
console.info(v_last);
console.info(v_last?.wordlen);
Вы также можете просто добавить условие if, чтобы предотвратить неопределенное значение.
let v_last: Done | undefined = this.donearr.pop();
if (v_last) {
console.info(v_last);
console.info(v_last.wordlen);
}
Поскольку метод Array.pop()
возможно возвращает undefined
. Машинопись заставит вас проверить это. В этом случае вы уверены, что Array.pop()
вернет неопределённое значение, поэтому вместо записи let v_last = this.donearr.pop()
вы можете написать let v_last = this.donearr.pop()!
(обратите внимание на знак «!»). Это означает, что вы уверены, что этот код всегда что-то вернет.
Обязательно проверьте: https://www.typescriptlang.org/tsconfig/#strictNullChecks
проблема, которую вы получаете, связана с проверкой типа typeScripts. this.donearr.pop() может возвращать неопределенное значение, если массив пуст. поэтому typeScript предупреждает вас, что v_last может быть неопределенным.
Чтобы решить эту проблему, вам необходимо обработать возможность неопределенного
Используйте проверку, определен ли v_last перед доступом к его свойствам.
let v_last = this.donearr.pop() ;
if (v_last !== undefined) {
console.info(v_last.wordlen);
} else {
console.info('The array is empty.');
}
Проблема, с которой вы столкнулись, связана со строгой проверкой типов в TypeScript. Когда вы вызываете функцию pop() для массива, она возвращает либо последний элемент массива, либо неопределенное значение, если массив пуст. Это означает, что v_last может иметь тип Done или неопределенный.
Использование сужения типа с помощью оператора if обычно является самым безопасным подходом, поскольку он явно обрабатывает неопределенный случай:
let v_last = this.donearr.pop();
if (v_last !== undefined) {
console.info(v_last.wordlen);
} else {
console.info("No elements in array");
}
let v_last = this.donearr.pop(); // here type will be inferred, no need to specify
console.info(v_last);
console.info(v_last?.wordlen); // and use optional changing to avoid runtime and ts errors
TypeScript предупреждает вас, что v_last может быть неопределенным, а доступ к свойству неопределенного значения вызовет
runtime error