当我try 在React项目中使用react-router-dom:6.22.3和TypScript时,我面临import type个问题

import { Route, createBrowserRouter, createRoutesFromElements } from "react-router-dom";
import type { RouteObject } from "react-router-dom";
import Root from "@src/routes/Root";
import Home from "@src/routes/Home";

const routes: RouteObject[] = createRoutesFromElements(
    <Route path="/" element={<Root />}>
        <Route index element={<Home />} />
    </Route>
);

const opts: DOMRouterOpts =

export const router: Router = createBrowserRouter(routes, opts);

VSCode找不到接口DOMRouterOpts和类型Router(从函数createBrowserRouter返回的类型).

我try 从npm安装@types/react-router-dom,但最新版本是5.3.3,这不适用于我当前的版本6.22.3.

有人知道如何解决这个问题吗?

推荐答案

DOMRouteOpts interface不出口.

interface DOMRouterOpts {
  basename?: string;
  future?: Partial<Omit<RouterFutureConfig, "v7_prependBasename">>;
  hydrationData?: HydrationState;
  unstable_dataStrategy?: unstable_DataStrategyFunction;
  window?: Window;
}

如果您明确需要,您可以自己定义接口:

import type {
  unstable_DataStrategyFunction,
  FutureConfig as RouterFutureConfig,
  HydrationState,
} from '@remix-router';

export interface DOMRouterOpts {
  basename?: string;
  future?: Partial<Omit<RouterFutureConfig, "v7_prependBasename">>;
  hydrationData?: HydrationState;
  unstable_dataStrategy?: unstable_DataStrategyFunction;
  window?: Window;
}
import {
  createBrowserRouter,
  createRoutesFromElements,
  Route,
} from "react-router-dom";
import type { RouteObject } from "react-router-dom";
import type { Router as RemixRouter } from '@remix-router';
import type { DOMRouterOpts } from "@types/DOMRouterOpts";
import Root from "@src/routes/Root";
import Home from "@src/routes/Home";

const routes: RouteObject[] = createRoutesFromElements(
  <Route path="/" element={<Root />}>
    <Route index element={<Home />} />
  </Route>
);

const opts: DOMRouterOpts = {
  // ... whatever options you are trying to specify ...
};

export const router: RemixRouter = createBrowserRouter(routes, opts);

尽管这一切可能都有些矫枉过正,因为createRoutesFromElementscreateBrowserRouter是用Typescript编写的,并且知道它们返回和消费的内容.路由选项basically只需要是与DOMRouterOpts的形状匹配的对象.以下内容可能也适合您.

import {
  createBrowserRouter,
  createRoutesFromElements,
  Route,
} from "react-router-dom";
import Root from "@src/routes/Root";
import Home from "@src/routes/Home";

const routes = createRoutesFromElements(
  <Route path="/" element={<Root />}>
    <Route index element={<Home />} />
  </Route>
);

const opts = {
  // ... whatever options you are trying to specify that
  // match what `createBrowserRouter` accepts ...
};

export const router = createBrowserRouter(routes, opts);

Typescript相关问答推荐

如何将@for的结果绑定到变量?

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

使用前的组件渲染状态更新

为什么在TypScript中写入typeof someArray[number]有效?

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

node—redis:如何在redis timeSeries上查询argmin?

有没有可能使用redux工具包的中间件同时监听状态的变化和操作

如果一个变量不是never类型,我如何创建编译器错误?

如何使用泛型类型访问对象

如何消除在Next.js中使用Reaction上下文的延迟?

MatTool提示在角垫工作台中不起作用

按函数名的类型安全类型脚本方法包装帮助器

从route.参数获取值.订阅提供";无法读取未定义";的属性

与toast.error一起react 中的Async TUNK错误消息

使用ngfor循环时,数据未绑定到表

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

在对象数组中设置值

是否使用类型将方法动态添加到类?

传入类型参数<;T>;变容函数

如何从联合类型推断函数参数?