С включенным --strictNullChecks
tsc, похоже, не может сделать вывод, что необязательное свойство не является неопределенным, если проверка происходит в отдельной функции. (См. пример, потому что у меня возникли проблемы с четкой формулировкой).
Учитывая интерфейс с необязательным свойством, например
interface Foo {
bar?: {
baz: string;
};
}
Компилируется следующий код:
//compiles
function doStuff(foo: Foo) {
if (foo.bar === undefined) {
throw new Error("foo.bar must be defined");
}
foo.bar.baz;
}
И этот код не работает, потому что tsc считает, что foo.bar может быть неопределенным:
//does not compile, foo.bar can be undefined
function doStuff2(foo: Foo) {
validateFoo(foo);
foo.bar.baz;
}
function validateFoo(foo: Foo) {
if (foo.bar === undefined) {
throw new Error("foo.bar must be defined");
}
}
Почему это? Есть ли способ пометить функцию как вещь, которая может проверять неопределенность и нуль? Я хотел бы избежать foo.bar!.baz
, если это возможно. В этом примере легко встроить if/throw, но если у Foo есть несколько необязательных свойств, которые необходимо проверить в нескольких функциях, они повторяются.