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: () => {},
});
我在 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: () => {},
});