Javascript 流类型和DOM对象

Javascript 流类型和DOM对象,javascript,dom,gulp,ecmascript-6,flowtype,Javascript,Dom,Gulp,Ecmascript 6,Flowtype,我正在尝试使用flowtype检查一些文件 不幸的是,我无法让它与dom对象一起工作: 我有这个密码 this.canvasContext = this.canvas.getContext('2d'); …返回此错误: src/CanvasManager.js:43 43: this.canvasContext = this.canvas.getContext('2d'); ^^^^^^^^^^^^^^^^^

我正在尝试使用flowtype检查一些文件

不幸的是,我无法让它与dom对象一起工作:

我有这个密码

this.canvasContext = this.canvas.getContext('2d');
…返回此错误:

src/CanvasManager.js:43
 43:         this.canvasContext = this.canvas.getContext('2d');
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `getContext`. Function cannot be called on
 43:         this.canvasContext = this.canvas.getContext('2d');


                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ HTMLCanvasElement
因此,flow基本上可以识别
htmlcanvaseElement
,但似乎不知道它有一个
getContext
方法

我错过什么了吗? 如果没有,有没有办法扩展DOM定义

创建自己的
HTMLCanvasElement
定义将导致名称不匹配:

src/PlayingField.js:23
 23:     constructor(gameController: GameController, canvas: HTMLCanvasElement) {
                                                             ^^^^^^^^^^^^^^^^^ HTMLCanvasElement. This type is incompatible with
 23:     constructor(gameController: GameController, canvas: HTMLCanvasElement) {
                                                             ^^^^^^^^^^^^^^^^^ HTMLCanvasElement

似乎这是一个从v0.18.1开始就存在的bug。

这在0.22.1中仍然是一个问题。由于某些原因,Flow无法正确地看到
document.createElement('canvas')
返回一种类型的
HTMLCanvasElement
,即使它在包含的DOM定义文件中定义为交集类型

要解决这个问题,只需添加一个if语句,用于检查
document.createElement
的返回值类型。例如:

var canvas = document.createElement('canvas');
if (!(canvas instanceof HTMLCanvasElement)) {
    throw new Error('Unable to construct HTMLCanvasElement.');
}

// Do canvas specific stuff here

错误消息未完成:“无法调用函数”。。。它说了什么?消息是完整的,但它很麻烦:-它只是分成不同的行
调用方法`getContext`。无法在HtmlCanvaElement上调用函数
我尝试更新-错误仍然存在于0.19:
$flow version flow中,这是JavaScript的静态类型检查器,版本0.19.0
奇怪。声明位于核心库源代码中。使用0.19,您可以提供自己的声明,这将覆盖核心库。请参阅中有关声明文件的部分。我对流0.19也有相同的问题。更新到流0.20后,错误更改为:
调用方法“getContext”。无法在交叉点上调用函数:函数类型。
这在版本0.22.1中仍然是一个问题。