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

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 шт):

Автор решения: PZBird

В данном случае 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
}
→ Ссылка