因此,在我的Reaction应用程序中,我在我的路由组件中使用了专用路由:

  const PrivateRoute = ({ children }: { children: ReactNode }) => {
  const { session } = useAuth();

  return !session ? <Navigate to={"/"} /> : children;
};

UseAuth挂钩:

export const useAuth = () => {
  const session = useContext(AuthContext);

    if (!session) {
      return { session: null, currentUser: null };
    }

  const currentUser = session.user;
  return { session, currentUser };
};

以下是嵌套在专用路由中的仪表板组件的示例:

 <Route
      path="/dashboard"
      element={
        <PrivateRoute>
          <Dashboard />
        </PrivateRoute>
      }
    />

现在,在我的仪表板组件中,IM收到错误'currentUser' is possibly 'null':

  const { currentUser } = useAuth();

  const { data: user_assignments } = useGetUserAssignments(currentUser.id);

Why in my private routes components i'm receiving that 100when it clearly only renders components when session is not null?

推荐答案

Dashboard组件不知道它是有条件地呈现的.TypeScrip只能推断从useAuth挂钩返回的提供的上下文值/类型,包括currentUser为空.

您可以使用可选的链运算符(?.)或NULL-CHECK/Guard-子句来判断currentUser是否存在,并为useGetUserAssignments挂钩提供有效的回退值.

const { currentUser } = useAuth();

const { data: user_assignments } = useGetUserAssignments(currentUser?.id ?? "");
const { currentUser } = useAuth();

const { data: user_assignments } = useGetUserAssignments(
  (currentUser && currentUser.id) ?? ""
);

或者,如果您相当确信在呈现DashboardcurrentUser可以104为空,则可以用Non-null Assertion Operator(!)来断言这一点.

const { currentUser } = useAuth();

const { data: user_assignments } = useGetUserAssignments(currentUser!.id);

仅供参考

更传统的PrivateRoute实现将呈现Outlet而不是childrenprops .这允许一次包装和保护多个布线/组件.

import { Navigate, Outlet } from 'react-router-dom';

const PrivateRoute = () => {
  const { session } = useAuth();

  return session ? <Outlet /> : <Navigate to="/" replace />;
};
<Route element={<PrivateRoute />}>
  <Route path="/dashboard" element={<Dashboard />} />
  {/* other protected routes */}
</Route>

Typescript相关问答推荐

我应该使用什么类型的React表单onsubmit事件?

为什么TypeScript失go 了类型推断,默认为any?''

如何缩小变量访问的对象属性范围?

使用泛型keyof索引类型以在if-condition内类型推断

不推荐使用Marker类-Google map API警告

为什么我的一个合成函数不能推断类型?

记录键的泛型类型

尽管对象的类型已声明,但未解析的变量<;变量

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

类型脚本-处理值或返回值的函数

try 使Angular依赖注入工作

将接口映射到交叉口类型

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

在Reaction中折叠手风琴

如何使用泛型函数参数定义类型脚本函数

如何调整项目数组,但允许权重影响顺序

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

递归JSON类型脚本不接受 node 值中的变量

Typescript泛型-键入对象时保持推理

如何为对象创建类型,其中键是只读且动态的,但值是固定类型?