typescript не умеет анализировать проверку каторая не в if?

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2023
interface IUser {
  user: {
    name: 'aaa';
  } | null;
}

const x: IUser = {} as IUser;

const isUser = x.user;

if (isUser) {
  //кидает ошибку `x.user is possibly null`
  x.user.name;
}

if (x.user) {
  // все норм
  x.user.name;
}

вопрос: можно ли как то дать понять ts что проверка в константе isUser .

Ответы

▲ 1Принят

В данном случае typescript подсвечивает все верно, посмотрите следующий пример

const x = {
  user: {
    name: 'aaa',
  }
}

const isUser = x.user;

x.user = null;

console.log(isUser);
console.log(x.user);

Как видно, даже если x.user присвоить null, ваш вложенный объект { name: 'aaa' } останется нетронутым и isUser все еще будет хранить на него ссылку. В итоге ваш if упадет при

const x: IUser = { user: { name: 'aaa' }} as IUser;

const isUser = x.user;

x.user = null;

if (isUser) { // прошли, так как isUser не пустой
  x.user.name; // упали так как x.user - null
}