带有 React.createContext 的 Typescript HOC

Posted

技术标签:

【中文标题】带有 React.createContext 的 Typescript HOC【英文标题】:Typescript HOC with React.createContext 【发布时间】:2019-07-21 22:41:20 【问题描述】:

我有这个需要翻译成 Typescript 的 .js sn-p。

import React from 'react';

const FirebaseContext = React.createContext(null)

export const withFirebase = Component => props => (
    <FirebaseContext.Consumer>
        firebase => <Component ...props firebase=firebase />
    </FirebaseContext.Consumer>
)

export default FirebaseContext

我最好的猜测是

const FirebaseContext = React.createContext(null)

export const withFirebase = (Component: React.ComponentClass) => (props: any) => (
    <FirebaseContext.Consumer>
        firebase => <Component ...props firebase=firebase />
    </FirebaseContext.Consumer>
)

但是当我尝试使用上下文时——通过传递new Firebase():

import React from 'react';
import ReactDOM from 'react-dom';

import './index.css';
import * as serviceWorker from './serviceWorker';

import App from './components/App';
import Firebase,  FirebaseContext  from './components/Firebase';

ReactDOM.render(
    <FirebaseContext.Provider value=new Firebase()>
        <App />
    </FirebaseContext.Provider>,
    document.getElementById('root'),
);

serviceWorker.unregister()

在这种情况下——我得到Type 'Firebase' is not assignable to type 'null'.

【问题讨论】:

【参考方案1】:

您似乎没有为createContext 指定任何类型。向其添加 Firebase 类型应该可以工作

const FirebaseContext = React.createContext<Firebase | null>(null);

【讨论】:

【参考方案2】:

更好的是创建类型并使用 Partial 作为默认值:

type FirebaseContextProps = 
  firebase: Firebase
  isOk: boolean
  data: string


const FirebaseContext= React.createContext<Partial<FirebaseContextProps>>()

<FirebaseContext.Provider value= firebase, isOk, data >

【讨论】:

以上是关于带有 React.createContext 的 Typescript HOC的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React.createContext() 与反应路由器一起使用?

react源码分析/createContext

“React.createContext 不是函数” - 但我没有使用它

有啥实用的方法可以在组件中调用“React.createContext()”吗?

相同的 React.createContext 在功能组件和 React.Components 中是如何工作的

使用 null 作为初始值时,`React.createContext(null)` 的打字稿类型