reactjs - react typescript : Correct types for Route location and children properties

标签 reactjs typescript react-router-v4

我有一个路由器,可以传递位置和子项的 Prop ,但我不知道这些 Prop 的正确类型是什么。

这是使用 react-router-dom 的路由器...

import React, { useReducer } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import { globalContext, setGlobalContext } from './components/context';
import { Layout } from './components/layout';
import { defaultState, globalReducer } from './components/reducer';
import { Home } from './routes/home';
import { NotFound } from './routes/notFound';

const Router: React.FC = () => {
  const [global, setGlobal] = useReducer(globalReducer, defaultState);
  return (
    <setGlobalContext.Provider value={{ setGlobal }}>
      <globalContext.Provider value={{ global }}>
        <BrowserRouter>
          <Route
            render={({ location }) => (
              <Layout location={location}>
                <Switch location={location}>
                  <Route exact path='/' component={Home} />
                  <Route component={NotFound} />
                </Switch>
              </Layout>
            )}
          />
        </BrowserRouter>
      </globalContext.Provider>
    </setGlobalContext.Provider>
  );
};

export { Router };

在布局组件内部,我有一个用于位置和子项的接口(interface),但由于我不知道这些的正确类型,我最终使用了任何类型,然后我的 linter 就会出现问题。

import React from 'react';

interface PropsInterface {
  children: any;
  location: any;
}

const Layout: React.FC<PropsInterface> = (props: PropsInterface) => {
  return (
    <div>
      <p>{props.location}</p>
      <p>{props.children}</p>
    </div>
  );
};

export { Layout };

我得到的错误是“any”的类型声明失去了类型安全性。考虑用更精确的类型替换它。 (no-any)tslint(1)

我可以从 import import { useLocation } from 'react-router-dom' 中获取位置吗;

最佳答案

Route 的接口(interface)您正在寻找的可以在 @types/react-router 中找到定义。

在您的项目中安装它之后,您应该能够使用如下界面来消除该 TS 错误:

// Layout.tsx

import { RouteProps } from "react-router";

interface ILayoutProps {
  location: RouteProps["location"];
  children: RouteProps["children"];
}

const Layout: React.FC<ILayoutProps> = (props: ILayoutProps) => {
  return <div>{props.children}</div>;
};

请记住,location是一个对象,所以 React 不会让你像以前那样渲染它。

这是一个工作示例的链接:https://codesandbox.io/s/zealous-snyder-yw9dg


另一种选择是使用 Partial接口(interface),但这将使所有 ILayoutProps可选:

interface ILayoutProps extends Partial<RouteProps> {}

关于reactjs - react typescript : Correct types for Route location and children properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59005481/

相关文章:

node.js - tsc 不转译 .at() 函数

reactjs - React Router/Redux/HOC 不适用于 'render' prop

ios - 从iOS主屏幕启动的React Web App怪异行为

javascript - 如何将空数组放入模板字符串

javascript - 截取 React 应用程序的屏幕截图并将其生成为 PDF

javascript - React-Router-Dom `Link` 更改路由,但没有组件加载

typescript - 如何定义一个与某些类型对象匹配的接口(interface)?

node.js - 如何将 Typescript 定义添加到 Express req 和 res

reactjs - React 返回 200 表示未找到页面?

reactjs - React Router 4 阻止页面重新加载