angular - 协助解决 TS2570 错误 : Property 'sendEmailVerification' does not exist on type 'Promise<User>' . 您是否忘记使用 'await' ?

标签 angular typescript firebase ionic-framework angularfire

我正在尝试在我的 Ionic Angular 项目上设置 Firebase。我正在使用链接教程 https://www.positronx.io/ionic-firebase-authentication-tutorial-with-examples/去做这个。
我不断收到 TS2570 错误:

Property 'sendEmailVerification' does not exist on type 'Promise'. Did you forget to use 'await'?


我附上了我的代码。我唯一改变的主要事情是 AngularFire 改变了 6.0.0 中使用 auth 的方式
import { Injectable, NgZone } from '@angular/core';
import { auth } from 'firebase/app';
import { User } from "./user";
import { Router } from "@angular/router";
import { AngularFireAuth } from "@angular/fire/auth";
import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore';

@Injectable({
  providedIn: 'root'
})

export class AuthenticationService {
  userData: any;

  constructor(
    public afStore: AngularFirestore,
    public ngFireAuth: AngularFireAuth,
    public router: Router,
    public ngZone: NgZone
  ) {
    this.ngFireAuth.authState.subscribe(user => {
      if (user) {
        this.userData = user;
        localStorage.setItem('user', JSON.stringify(this.userData));
        JSON.parse(localStorage.getItem('user'));
      } else {
        localStorage.setItem('user', null);
        JSON.parse(localStorage.getItem('user'));
      }
    })
  }

  // Login in with email/password
  SignIn(email, password) {
    return this.ngFireAuth.signInWithEmailAndPassword(email, password)
  }

  // Register user with email/password
  RegisterUser(email, password) {
    return this.ngFireAuth.createUserWithEmailAndPassword(email, password)
  }

  // Email verification when new user register
  SendVerificationMail() {
      return this.ngFireAuth.currentUser.sendEmailVerification()
      .then(() => {
        this.router.navigate(['verify-email']);
      })
    }

  // Recover password
  PasswordRecover(passwordResetEmail) {
    return this.ngFireAuth.sendPasswordResetEmail(passwordResetEmail)
    .then(() => {
      window.alert('Password reset email has been sent, please check your inbox.');
    }).catch((error) => {
      window.alert(error)
    })
  }

  // Returns true when user is looged in
  get isLoggedIn(): boolean {
    const user = JSON.parse(localStorage.getItem('user'));
    return (user !== null && user.emailVerified !== false) ? true : false;
  }

  // Returns true when user's email is verified
  get isEmailVerified(): boolean {
    const user = JSON.parse(localStorage.getItem('user'));
    return (user.emailVerified !== false) ? true : false;
  }

  // Sign in with Gmail
  GoogleAuth() {
    return this.AuthLogin(new auth.GoogleAuthProvider());
  }

  // Auth providers
  AuthLogin(provider) {
    return this.ngFireAuth.signInWithPopup(provider)
    .then((result) => {
       this.ngZone.run(() => {
          this.router.navigate(['dashboard']);
        })
      this.SetUserData(result.user);
    }).catch((error) => {
      window.alert(error)
    })
  }

  // Store user in localStorage
  SetUserData(user) {
    const userRef: AngularFirestoreDocument<any> = this.afStore.doc(`users/${user.uid}`);
    const userData: User = {
      uid: user.uid,
      email: user.email,
      displayName: user.displayName,
      photoURL: user.photoURL,
      emailVerified: user.emailVerified
    }
    return userRef.set(userData, {
      merge: true
    })
  }

  // Sign-out
  SignOut() {
    return this.ngFireAuth.signOut().then(() => {
      localStorage.removeItem('user');
      this.router.navigate(['login']);
    })
  }

}
它被调用的唯一时间是在此处的注册页面中
signUp(email, password){
        this.authService.RegisterUser(email.value, password.value)
        .then((res) => {
          // Do something here
          this.authService.SendVerificationMail()
          this.router.navigate(['verify-email']);
        }).catch((error) => {
          window.alert(error.message)
        })
    }

}
这些是项目中使用的依赖项:
    "@angular/common": "~8.2.14",
    "@angular/core": "~8.2.14",
    "@angular/fire": "^6.0.0",
    "@angular/forms": "~8.2.14",
    "@angular/platform-browser": "~8.2.14",
    "@angular/platform-browser-dynamic": "~8.2.14",
    "@angular/router": "~8.2.14",
    "@capacitor/cli": "^2.0.1",
    "@capacitor/core": "^2.0.1",
    "@capacitor/ios": "^2.0.1",
    "@ionic-native/core": "^5.0.7",
    "@ionic-native/splash-screen": "^5.0.0",
    "@ionic-native/status-bar": "^5.0.0",
    "@ionic/angular": "^5.0.0",
    "core-js": "^2.5.4",
    "firebase": "^7.14.0",
    "rxjs": "~6.5.1",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
如果有人可以给我有关如何解决此问题的任何提示?我不是 100% 确定如何在不显示更多错误的情况下实现异步和等待函数。

最佳答案

新版本 AngularFire 6.0.0 发布,支持 Angular 9。它不向后兼容 与旧版本。它不再支持旧版本的 Angular (<9)。它还放弃了对旧版 Typescript(<3.6.4)、Firebase Javascript SDK (<7.13.1) 和 firebase-tools(<8.0.0) 的支持。

AngularFireAuth 的“auth”属性已被弃用,因此“currentUser”的用法也已更改。

'currentUser' 是解析当前用户的 promise 。属性“sendEmailVerification”不存在,但可以通过解析的用户轻松访问。

  // Email verification when new user register
  SendVerificationMail() {
    return this.ngFireAuth.currentUser.then(u => u.sendEmailVerification())
    .then(() => {
      this.router.navigate(['verify-email']);
    })
  }

关于angular - 协助解决 TS2570 错误 : Property 'sendEmailVerification' does not exist on type 'Promise<User>' . 您是否忘记使用 'await' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61214731/

相关文章:

javascript - 存储和检索用户访问信息的最佳、最安全的地方

javascript - 如何在 Ionic 2 应用程序中使用 MathJax

javascript - React Native - React Native Firebase - Google 登录 Android

firebase - 在 React-Native 中获取 FCM token

css - 隐藏正文(html)以 2/4 的 Angular 滚动

Angular 8 + Firebase : Cannot initialize project due to AngularFireModule. initializeApp(environment.firebase)

javascript - 为什么在我的应用程序中更改选项卡时生命周期 Hook 不运行?

typescript - 根据 TypeScript 中的查找类型限制通用键类型

angular - "Maximum call stack size exceeded"在 Angular 9 ng build --prod 中用于库

android - AdMob 无法在真实设备上运行