Type Guard в TypeScript

Рейтинг: 1Ответов: 1Опубликовано: 22.03.2023

В чем причина такого поведения ?

const dataObject: {[key: string] : {[k: string]: string | null}} = {
  user: {
    name: 'ivan',
    surname: 'ivanov',
  }
}

const u: string = 'user'
const n: string = 'name'

const keys: string[] = ['name', 'surname']

for (const property in dataObject[u]) {
  let diff: string = 'null'
  if (dataObject[u][property] !== null) {
    diff = dataObject[u][property]     //Type 'string | null' is not assignable to type 'string'.Type 'null' is not assignable to type 'string'
    console.log(diff)
  }
}


let diff: string = 'null'
if (dataObject[u][n] !== null) {
  diff = dataObject[u][n] // Работает корректно
  console.log(diff)
}

Для diff = dataObject[u][property] можно воспользоваться !и ошибка уйдет. Но хотелось бы узнать, можно ли решить это без ! и почему такое поведение ?

Ответы

▲ 0Принят

TS не настолько умный (или наоборот слишком умный) что бы понять что происходит обращение к одному и тому же свойству.

Самое простое — сохранить значение в переменную.

for (const property in dataObject[u]) {
  let diff: string = 'null'
  const value = dataObject[u][property]
  if (value !== null) {
    diff = value
  }
}

или можно вообще сделать чуть короче:

for (const property in dataObject[u]) {
  const diff: string = dataObject[u][property] ?? 'null'
}

P.S. ваш последний пример работает корректно потому что u и n константы. Если заменить const n на let n, то будет такая же ошибка.