Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在react路由器中,this.context.router的类型是什么?_Reactjs_Typescript_React Router - Fatal编程技术网

Reactjs 在react路由器中,this.context.router的类型是什么?

Reactjs 在react路由器中,this.context.router的类型是什么?,reactjs,typescript,react-router,Reactjs,Typescript,React Router,为了设置上下文,我加入了,但随着我的跟进,我实际上在用TypeScript做所有的事情。在本教程的这一点上,在几个React组件中有一个称为Repos export class Repos extends React.Component<ReposProps, {}> { ... } Repos中的某个地方有一个方法,该方法从HTML表单中获取一些参数,并构造一个新路径来引导浏览器: handleSubmit(event: React.FormEvent) { /* ...

为了设置上下文,我加入了,但随着我的跟进,我实际上在用TypeScript做所有的事情。在本教程的这一点上,在几个React组件中有一个称为
Repos

export class Repos extends React.Component<ReposProps, {}> { ... }
Repos
中的某个地方有一个方法,该方法从HTML表单中获取一些参数,并构造一个新路径来引导浏览器:

handleSubmit(event: React.FormEvent) {
    /* ... (define userName and repo vars) */
    const path = `/repos/${userName}/${repo}`
    this.context.router.push(path);
}
我的问题是最后一行的
context
router
的类型是什么?

在本文中,我理解了上下文通常是在每个元素中定义的。在这里,用一个从中定义的接口扩展而来的接口在
Repos
中定义
context
似乎是一个绝妙的想法

在这里,
Something
router
定义为具有
push
方法的某种类型

虽然有,但是没有说路由器有一个方法,这是令人困惑的。无论如何,DefinitelyTyped上的类型定义没有定义
路由器
下的
推送
方法(虽然我不认为它们是完美的,但这种省略对我来说并不是偶然的)

同样的API指出了提到上下文的部分。router--
上下文。router
定义了
推送()
以及许多其他方法

然后我注意到在react router的类型定义的history.d.ts中,接口
history
具有所有相同的方法(加上更多的方法)

也许这个界面已经很接近了。它没有像我所希望的那样扩展任何东西(也许这是react路由器打字需要改进的地方),但它有我所需要的

interface ContextRouter extends History { }

interface ReposContext {
    router: ContextRouter
}

我仍然怀疑,因为它没有太多的意义,虽然
ContextRouter
扩展了
历史

我已经通过深入react路由器代码找到了这个问题。通过找出路由器是如何创建的,我最终发现路由器实际上是通过将历史传递给createRouterObje创建的ct,它只创建一个与历史具有相同属性的对象以及一些其他属性


路由器的类型确实扩展了历史。我使用ReactRouter.RouterOnContext:

context: {
    router: ReactRouter.RouterOnContext
}
interface ContextRouter extends History { }

interface ReposContext {
    router: ContextRouter
}
context: {
    router: ReactRouter.RouterOnContext
}