interface SomeType {
a: string;
b?: string;
}
const foo: SomeType = {
a: 'hello',
b: 'there'
};
const bar: SomeType = {
a: 'hello'
};
bar.b = 'there';
// Error on this line
const str: string = foo.b;
// These lines have no error
const str2: string = foo.b ? foo.b : '';
const str3: string = foo.b!;
const str4: string = bar.b;
В приведенном выше примере у нас есть 2 варианта создания объекта SomeType
, который имеет необязательное свойство b
. При объявлении foo
мы устанавливаем значение b
при создании объекта. Для bar
мы устанавливаем значение b
после создания объекта.
При создании первой строки str
возникает ошибка:
Тип 'строка | undefined 'нельзя назначить типу' string '. Тип 'undefined' нельзя назначить типу 'string'.ts (2322)
Эта ошибка смягчается с помощью подходов для str2
и str3
. Я понимаю, что в этих примерах мы либо проверяем значение foo.b
, либо утверждаем, что знаем, что foo.b
имеет значение.
Я не понимаю, почему ошибка не появляется, когда str4
создано. Почему TypeScript способен обнаружить, что bar.b
- это , а не undefined
, но он не смог обнаружить то же самое для foo.b
? Каково то, как мы устанавливаем свойство, которое приводит к этой ошибке?
(TypeScript Version 3.8.2)