Type Guard в TypeScript
В чем причина такого поведения ?
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] можно воспользоваться !и ошибка уйдет.
Но хотелось бы узнать, можно ли решить это без ! и почему такое поведение ?
Ответы (1 шт):
Автор решения: Alexey Ten
→ Ссылка
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, то будет такая же ошибка.