流类型:使用返回父 class 的函数的扩展 class

Flow type: use extended class from function returning parent class

如何让流程将 document.getElementById 中的 return 值解释为 HTMLInputElement,而不是更一般的 HTMLElement

示例:

let input = document.getElementById('myinput');
console.log(input.value);


script.js:28
 28:   console.log(input.value);
                         ^^^^^ property `value`. Property not found in
 28:   console.log(input.value);
                   ^^^^^ HTMLElement

来自https://github.com/facebook/flow/blob/master/lib/dom.js

declare class Document extends Node {
  …
  getElementById(elementId: string): HTMLElement;
  …
}

但是,getElementById 可以 return 一个子类(在本例中 HTMLInputElement

declare class HTMLInputElement extends HTMLElement {
  …
  value: string;
  …
}

我希望能够在不引发错误的情况下访问输入元素的 value 属性。

问题是 Flow 编译器不知道什么类型的 HTMLElement input 变量会提前,它会抛出错误。

在这种情况下,通常建议人们这样做:

var input = document.getElementById('myinput');

if (input instanceof HTMLInputElement) {
    console.log(input.value);
}

在文档的 dynamic type tests 部分阅读有关此技术的信息。