Firebase 身份验证+TS。类型 'boolean' 不可分配给类型 'Promise<UserCredential>'

Firebase Auth+TS. Type 'boolean' is not assignable to type 'Promise<UserCredential>'

我在 nextJS 应用程序中使用带有 TS 的 firebase 身份验证。

我正在尝试设置 AuthProvider 并使用上下文。

interface IAuth {
  user: User | null;
  login: (data: FormData) => Promise<firebase.auth.UserCredential>;
  logout: () => void;
}

type FormData = {
  email: string;
  password: string;
};

type User = firebase.User;
// type UserCredential=firebase.auth.UserCredential

const AuthContext = createContext<IAuth>({
  user: null,
  login:(data: FormData) => Promise<firebase.auth.UserCredential>,
  logout: () => {},
});

我在 login 函数上收到此警告:

Type '(data: FormData) => boolean' is not assignable to type '(data: FormData) => Promise<UserCredential>'.
  Type 'boolean' is not assignable to type 'Promise<UserCredential>'.

这是我的auth.tsx

export const AuthProvider = ({ children }: AuthProviderProps): JSX.Element => {
  firebaseClient();
  const [user, setUser] = useState<User | null>(null);

  useEffect(() => {
    return firebase.auth().onIdTokenChanged(async (user) => {
      console.log('auth changed');
      console.log(user ? user.getIdToken : 'Nothing');
      if (!user) {
        setUser(null);
        nookies.set(undefined, 'token', '', {});
        return;
      }
      const token = await user.getIdToken();
      setUser(user);
      nookies.set(undefined, 'token', token, {});
    });
  }, []);

  const login = async (data: FormData): Promise<firebase.auth.UserCredential> => {
    return await firebase.auth().signInWithEmailAndPassword(data.email, data.password);
  };

  const logout = async () => {
    console.log('Logging out');
    return await firebase.auth().signOut()
  };
  return <AuthContext.Provider value={{ user, login, logout }}>{children}</AuthContext.Provider>;
};
export const useAuth = () => useContext(AuthContext);

如何在 AuthContext 中提及 return 类型?

const AuthContext = createContext<IAuth>({
  user: null,
  login:(data: FormData) => Promise<firebase.auth.UserCredential>,
  logout: () => {},
});

您需要从登录方法return Promise<firebase.auth.UserCredential>,但您只需要写入 atm 类型。尝试将代码重构为:

const login = async (data: FormData) => {
  return await firebase.auth().signInWithEmailAndPassword(data.email, data.password);
};

const AuthContext = createContext<IAuth>({
  user: null,
  login:(data: FormData) => login, // <-- add the function here
  logout: () => {},
});