Typescript, охранники типов не работают правильно в asyn c функциях? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь реализовать функцию аутентификации для пользовательских ролей, используя typcript и firebase / store, и заметил что-то странное, когда в asyn c функциях защиты типов используются предохранители. В частности, с .then().

Ниже приведен фрагмент кода с проблемой (вне контекста для краткости):

authUser: firebase.User | null;
...

if (authUser) {
  this.user(authUser.uid)
    .get()
    .then(snapshot => {
      const dbUser = snapshot.data();
      if (dbUser && !dbUser.roles) dbUser.roles = {};
      authUser = {
          uid: authUser.uid,
          email: authUser.email,
          emailVerified: authUser.emailVerified,
          providerData: authUser.providerData,
          ...dbUser,
      };
      next(authUser);
    });
} else {
  ...
}

Компилятор машинописного текста жалуется, что в authUser = { uid: authuser.uid ... } block, authUser возможно null. Как это возможно, когда оно находится внутри оператора if? Это как-то связано с тем, что функция asyn c?

1 Ответ

4 голосов
/ 07 января 2020

Хотя authUser не был нулевым, когда вы выполняли обещание, он МОЖЕТ БЫТЬ нулевым, когда обещание выполняется в зависимости от времени. Таким образом, компилятор справедливо жалуется, что он может быть нулевым. Помните, что это произойдет позже, в неопределенное время, и другой код, возможно, изменил его к тому времени.

Вам нужно будет проверить и обработать случай в then для обработки любого временного сценария ios, который может возникнуть .

...