2016-02-21 13 views
2

要設置上下文,我在lesson 12 of react-router-tutorial,但隨着我一直沿着,我實際上在做TypeScript中的所有事情。在教程這一點上,在幾個反應的組分被一個稱爲Repos在react-router中,this.context.router的類型是什麼?

export class Repos extends React.Component<ReposProps, {}> { ... } 
,其一個 Router

<Router history={browserHistory}> 
    {/* ... */} 
    <Route path="/repos" component={Repos}>{/* ... */}</Route> 
    {/* ... */} 
</Router> 

某處內側Repos創建

是需要一些參數從HTML形式的方法和構造一個新的路徑,瀏覽器直接到:

handleSubmit(event: React.FormEvent) { 
    /* ... (define userName and repo vars) */ 
    const path = `/repos/${userName}/${repo}` 
    this.context.router.push(path); 
} 

我的問題是最後一行是contextrouter的類型是什麼?

the React documentation on Contexts我明白,上下文通常在每個元素中定義。這似乎是在這裏輝煌的想法是在Repos定義context與來自react-router's TypeScript type definitions

interface ReposContext extends Something /* ??? */ { } 

這裏,Something定義將有router定義爲某種類型的具有push方法的一些接口擴展的接口。

API並不是說Router有一個方法push雖然Glossary這樣做,這是混亂。無論如何,在DefinitelyTyped類型定義不Router下定義push方法(雖然我不相信他們是完美的,這個遺漏似乎並不意外我)

這些相同的API並指出RouterContext其中提到context.router - - context.router確實定義了push()以及其他一些方法。

那好吧我在反應路由器的類型定義history.d.ts注意到,接口History具有所有的相同方法(加上一對夫婦更

也許這個接口越來越接近呢。這不是任何延伸因爲我曾它想(也許這就是餘地反應路由器分型,以提高),但它有我需要什麼。

interface ContextRouter extends History { } 

interface ReposContext { 
    router: ContextRouter 
} 

我仍然懷疑,因爲它並不完全意義儘管這ContextRouter延伸History

回答

0

我已經通過深入反應路由器代碼來弄清楚這一點。通過計算路由器是如何創建的,我最終在match.js中發現路由器實際上是通過將歷史傳遞給createRouterObject創建的,該路由器創建的對象具有與歷史相同的屬性以及一些其他屬性。

路由器的類型確實擴展了歷史記錄。

2

我使用ReactRouter。RouterOnContext:

context: { 
    router: ReactRouter.RouterOnContext 
}