带有 React.createContext 的打字稿 HOC

Typescript HOC with React.createContext

我有这个 .js 片段,我需要将其翻译成 Typescript。

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'.

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

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

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

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

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

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