Оператор ненулевого подтверждения не работает - PullRequest
0 голосов
/ 04 октября 2019

Ошибка выполнения:

TypeError: Невозможно прочитать свойство 'id' из неопределенного

if (!this.havingMultipleProjects) {//having only 1 project or not at all
  if (this.authenticationProvider.member.projects != null) 
this.projectProvider.projectId = this.authenticationProvider.member!.projects[0]!.id;
   }

Можете ли вы сказать мне, как избежать вышеуказанной ошибки? Я использовал Оператор ненулевого подтверждения . Но все же, это дает вышеуказанную ошибку. Любая подсказка?

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Как уже упоминалось в комментариях, оператор нулевого утверждения .... Оператор сообщает компилятору, что это значение определенно будет иметь значение во время выполнения , поэтому во время выполнения возникнет ошибка.

Итак, ошибка ....

TypeError: Невозможно прочитать свойство 'id' из неопределенного

, очевидно, тогда ...

this.authenticationProvider.member.projects[0]

это undefined. Это нормально, он проходит, если у вас есть, так как вы не проверяете длину массива:

if (this.authenticationProvider.member.projects != null) 

Итак, ваш код проходит, если projects равно []

Iбудет просто делать if (this.authenticationProvider.member.projects), он включает проверку, если он вообще существует, охватывающий null, undefined, false в целом. Затем, после этого, проверьте, действительно ли в массиве есть объект, поэтому ваш оператор if может выглядеть следующим образом:

if (this.authenticationProvider.member.projects && this.authenticationProvider.member.projects.length)

, если вы не уверены, что существует даже member, вам следуетсделать дополнительную проверку для этого ...

if (this.authenticationProvider.member && 
    this.authenticationProvider.member.projects && 
    this.authenticationProvider.member.projects.length)
1 голос
/ 04 октября 2019

non-null assertion operator не не гарантирует, что вы не получите ошибки, если ваши данные «неверны».
Работает с типами, не с фактическими данными.
Это просто для создания / настройки ваших типов.

Однако, если вы хотите просто получить undefined (таким образом, не будет выдано никакой ошибки), если projects[0] не существует, вы можетеиспользуйте опциональный оператор цепочки , который приземлится в 3.7 .

Итак, вы сможете использовать его так:

this.authenticationProvider.member?.projects[0]?.id

а если projects[0] равно undefined, все выражение будет иметь значение undefined, и вы не получите ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...