Оператор Typescript if не понимает ссылочную проверку

typescript

#typescript

Вопрос:

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

 type Person = {
  name: string | undefined;
  nickName: string | undefined;
};

const personObj: Person = {
  name: 'Random Name',
  nickName: 'Random NickName',
};
 

В typescript это условие позволяет нам разделить строку, и ошибки компиляции нет

 if (personObj.nickName) {
  const splitValue = personObj.nickName.split(' ');
  console.log(splitValue);
}
 

Однако, если я проверяю сохранение personObj.nickName в переменной, разделение строки выдает ошибку:

 const nickNameExists = personObj.nickName;
// or const nickNameExists = Boolean(personObj.nickName);

if (nickNameExists) {
  const splitValue = personObj.nickName.split(' '); // error TS2532: Object is possibly 'undefined'.
  console.log(splitValue);
}
 

Почему Typescript не работает с условиями, содержащими ссылку?
Игровая площадка

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

1. вы должны просто использовать синтаксис ?. (if вызовет split только в том случае, если personObj.nickName существует). Поскольку он уже существует, поскольку typescript «тупой», он всегда будет равен «nickName.split (» «)», но typescript будет доволен, поскольку он будет уверен, что метод разделения существует

2. Да, но зачем это все еще нужно? Я уже проверил это в операторе if

3. проверка типов выполняется с помощью typescript независимо от предыдущего кода. Ваше условие гарантирует вам , что оно не является неопределенным, но что касается транспилятора typescript, оно все равно может быть «неопределенным», поскольку это возможный тип . Главная проблема заключается в том, что транспилер тупой И действительно умный, поэтому он потерпит неудачу в этих очевидных для нас вещах. Но если бы это было «умнее», время переноса заняло бы намного больше времени.

Ответ №1:

используйте интерфейс вместо типа

 interface Person = {
  name: string | undefined;
  nickName: string | undefined;
};

const personObj: Person = {
  name: 'Random Name',
  nickName: 'Random NickName',
};



 

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

1. нет, игровая площадка все еще показывает ошибку