Объект возможен undefined?

Я не понимаю, почему я получаю сообщение об ошибке «Возможно, объект не определен» в this.selectedBugReport. Я убеждаюсь, что он не может быть неопределенным, и сохраняю результат в константе. Но это проблема для Angular?

Ошибка

const test = this.selectedBugReport !== undefined;
if (test) // if (test === true) also errors
{
  // @ts-ignore
  const i = this.selectedBugReport.id; // << no error because of ignore

  const h = this.selectedBugReport.id; // <<< error!!
}

Нет ошибок

if (this.selectedBugReport !== undefined)
{
  // @ts-ignore
  const i = this.selectedBugReport.id; // << no error

  const h = this.selectedBugReport.id; // <<< no error
}

Я использую Angular 11 и IDE WebStorm, если это имеет значение.

Обновление:

Является ли это лучшей практикой, чтобы заставить его работать (для более сложных случаев, чтобы избежать более 100 операторов if)?

const test: MyDto = this.selectedBugReport as MyDto; // This line looks stupid to me.
const foo = test.id; // no error, no if-checks required anymore.

person Napoleon    schedule 06.01.2021    source источник
comment
Разве вершина if не должна быть if(this.selectedBugReport)?   -  person Bojan Kogoj    schedule 06.01.2021
comment
Это проблема машинописного текста, а не специфичная для angular. Вам нужно будет правильно ввести this.selectedBugReport. То, что вы сделали с !== undefined, просто сделает его логическим выводом, так что это не сработает.   -  person MikeOne    schedule 06.01.2021
comment
Итак, если у меня есть такой случай внутри более «сложного» случая, такого как вложенный тернарный оператор, тогда мне нужно выполнить проверку if-check, например 5x, в КАЖДОЙ отдельной строке, где она применяется? Я не могу определить для него константу? Это кажется неэффективным и сложным в обслуживании... Пример для FormGroup: selectProject: [this.isEdit ? this.selectedBugReport === не определено? projectId : -1 : ‹вставьте сюда больше троичной ерунды›] Это одна строка, и она будет содержать около 5 проверок if каждая... Будет много проверок if... И я на 100% уверен, что это может не быть неопределенным.   -  person Napoleon    schedule 06.01.2021
comment
Вы можете просто сделать const test = this.selectedBugReport as MyDto; или const test: MyDto = this.selectedBugReport; (в зависимости от того, как набирается selectedBugReport). Только одна сторона должна быть явно введена. И это не взлом; становится ясно, к какому типу относятся ваши объекты. Вам не нужны никакие if, если вы правильно ввели свои объекты и свойства.   -  person Heretic Monkey    schedule 06.01.2021
comment
Я думал, что это взлом, но, видимо, тогда это решение. Если вы можете опубликовать это как ответ, я могу принять его.   -  person Napoleon    schedule 06.01.2021
comment
Я бы использовал if(this.selectedBugReport) или nullsafe this.selectedBugReport?.id   -  person Antoniossss    schedule 06.01.2021


Ответы (1)


Утверждение типа, такое как MyDto, хорошо, но я рекомендую добавить его в tsconfig.json:

{
    "compilerOptions": {
        "strictNullChecks": false,
        // .... 
    }
}

Это безопасно для ошибок времени выполнения.

person Tomáš Wróbel    schedule 06.01.2021