【问题标题】:TS2322: Type error while im using useContext with a functionTS2322:当我将 useContext 与函数一起使用时出现类型错误
【发布时间】:2021-11-21 08:27:27
【问题描述】:

我很想通过 Provider value ={ ..} 传递我想要对更改做出反应的状态和功能。 我有一个接受 userId 和 token 的登录功能和一个不接受任何东西的注销功能。 在 AuthContext 中,我创建了一个接口,声明了函数接受的类型,但仍然出现 TS2322 错误。

错误是:

TS2322:类型'{用户ID:字符串|空值;令牌:字符串 |空值; isLoggedIn:布尔值;登录:(令牌:字符串,uid:字符串)=> void;注销:() => 无效; }' 不可分配给类型 'Auth'。对象字面量只能指定已知属性,而 'Auth' 类型中不存在 'login'。

AuthContext.tsx

import {createContext} from "react";

interface Auth{
  userId:string | null;
  token: string | null;
  isLoggedIn: boolean;
  (t:string | null, id:string | null) : void;
  (): void;
}

export const AuthContext = createContext<Auth | null>(null);

App.tsx

import {AuthContext} from "./shared/context/AuthContext";

const App: React.FC = () => {

const [token, setToken] = useState<string | null>(null);
const [userId, setUserId] = useState<string | null>(null);

const login = useCallback((token:string, uid:string) => {
    setToken(token);
    setUserId(uid);
}, []);

const logout = useCallback(() => {
    setToken(null);
    setUserId(null)
}, []);

return (
    <AuthContext.Provider value={{
        userId: userId,
        token: token,
        isLoggedIn: !!token,
        login: login, //  **** TS2322 Error at this line ****
        logout: logout
    }}>
        <div className="App">
            <BrowserRouter forceRefresh={true}>
                <Switch>
                    <Route exact path="/">
                        <Home/>
                    </Route>
                    <Route path="/login">
                        <LoginForm/>
                    </Route>
                    <Route path="/signup">
                        <RegisterForm/>
                    </Route>
                    <Route path="/cart">
                        <Cart/>
                    </Route>
                    <Redirect to="/" from="*"/>
                </Switch>
            </BrowserRouter>
        </div>
    </AuthContext.Provider>
);
}

export default App;

【问题讨论】:

    标签: reactjs typescript use-context


    【解决方案1】:

    错误信息实际上很清楚。您需要在 Auth 接口上专门定义登录/注销属性。

    interface Auth{
      userId:string | null;
      token: string | null;
      isLoggedIn: boolean;
      login(token:string | null, uid:string | null) : void;
      logout(): void;
    }
    

    【讨论】:

    • 我在这方面很新,所以我认为我不需要在 Auth 中写函数的名称。它修复了它,谢谢:)
    • 别担心,我试图让您意识到,大多数情况下,错误消息中已经给出了答案。很高兴它解决了您的问题!
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2016-08-28
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2019-09-18
    • 2019-03-20
    相关资源
    最近更新 更多