sfl*_*low 14 javascript reactjs flowtype
我在Flow类型检查中得到了以下错误.
Cannot call ReactDOM.render with document.getElementById(...) bound to container because null [1] is
incompatible with Element [2].
src/index.js
26? </Switch>
27? </ScrollToTop>
28? </BrowserRouter>
29? </Provider>, document.getElementById("root"));
30?
/private/tmp/flow/flowlib_174a8121/dom.js
[1] 646? getElementById(elementId: string): HTMLElement | null;
/private/tmp/flow/flowlib_174a8121/react-dom.js
[2] 18? container: Element,
Run Code Online (Sandbox Code Playgroud)
代码如下.
// @flow
"use strict";
import React from "react";
import ReactDOM from "react-dom";
import {createStore, applyMiddleware} from "redux";
import {Provider} from "react-redux";
import {BrowserRouter, Switch, Route} from "react-router-dom";
import Home from "./components/home";
import Detail from "./components/detail";
import LevelOfGame from "./components/level-of-game";
import NotFound from "./components/not-found";
import ScrollToTop from "./components/scroll-to-top";
import reducers from "./reducers";
const createStoreWithMiddleware = applyMiddleware()(createStore);
ReactDOM.render(<Provider store={createStoreWithMiddleware(reducers)}>
<BrowserRouter>
<ScrollToTop>
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/detail/:detailId" component={Detail}/>
<Route path="/level-of-game" component={LevelOfGame}/>
<Route path="*" component={NotFound} status={404}/>
</Switch>
</ScrollToTop>
</BrowserRouter>
</Provider>, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
我相信我必须以某种方式指定类型getElementById
.
所以我通过存储document.getElementById("root");
一个带有类型规范的常量变量来修复错误:
const root: any = document.getElementById("root");
Run Code Online (Sandbox Code Playgroud)
错误是固定的,我希望这对其他人有用,但我很想知道造成这个错误的原因.任何人都可以这么好,告诉我这是什么?
cog*_*ell 21
Aleksey L.在评论中首先得到了这个,我希望将这些信息提升到答案级别,以便更轻松地进行视觉扫描.
Flow让你知道调用document.getElementById("root");
可以返回,null
在这种情况下应用程序将完全崩溃.所以让我们警惕:
const root = document.getElementById('root')
if (root !== null) {
ReactDOM.render(<App /> , root)
}
Run Code Online (Sandbox Code Playgroud)
当然,考虑到你很可能会控制你正在渲染的HTML,这会让你觉得有些烦人.
小智 5
虽然科格尔的答案是正确的,但我认为应该让代码更简单并添加一个例外。
ReactDOM.render(
<Provider store={createStoreWithMiddleware(reducers)}>
<BrowserRouter>
<ScrollToTop>
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/detail/:detailId" component={Detail}/>
<Route path="/level-of-game" component={LevelOfGame}/>
<Route path="*" component={NotFound} status={404}/>
</Switch>
</ScrollToTop>
</BrowserRouter>
</Provider>, // $FlowIgnore
document.getElementById("root")
);
Run Code Online (Sandbox Code Playgroud)
注意“$FlowIgnore”注释
然后在您的.flowconfig
文件中将其添加到“选项”字段中:
suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore
归档时间: |
|
查看次数: |
3596 次 |
最近记录: |