Flowtype 为什么流仍然抱怨document.getElementById的空值

Flowtype 为什么流仍然抱怨document.getElementById的空值,flowtype,Flowtype,为什么即使使用IF检查,流仍然会抱怨可能的空值 if(document && document.getElementById("myID") && document.getElementById("myID").offsetWidth){ console.log(document.getElementById("myID").offsetWidth); } 给出了这个错误 ^ property `offsetWidth`. Property cannot

为什么即使使用IF检查,流仍然会抱怨可能的空值

if(document && document.getElementById("myID") && document.getElementById("myID").offsetWidth){
 console.log(document.getElementById("myID").offsetWidth);
}
给出了这个错误

   ^ property `offsetWidth`. Property cannot be accessed on possibly null value

Flow无法知道对
getElementById
的第一次调用成功意味着后面的调用也会成功。据它所知,读取
offsetWidth
属性可能会导致
getElementById
在下次调用时开始返回
null

您需要存储该值,例如

const myIdEl = document && document.getElementById("myID");

if(myIdEl && myIdEl.offsetWidth) {
   console.log(myIdEl.offsetWidth);
}

通过这种方式,
myIdEl
在被引用后无法变为null。

流无法知道对
getElementById
的第一次调用成功意味着后面的调用也将成功。据它所知,读取
offsetWidth
属性可能会导致
getElementById
在下次调用时开始返回
null

您需要存储该值,例如

const myIdEl = document && document.getElementById("myID");

if(myIdEl && myIdEl.offsetWidth) {
   console.log(myIdEl.offsetWidth);
}
通过这种方式,
myIdEl
在被引用后不能变为null。

对于FlowType中的HtmleElement(以及HtmleElement的扩展,如VideoHtmleElement),我建议使用
instanceof
来验证类型并验证它是否为null

另外,我认为您不需要检查是否存在在flow(1)中全局定义的
文档*

示例
constmyidel:?HTMLElement=document.getElementById('myID');
if(HtmleElement的myIdEl实例){
//继续
console.log(myIdEl.offsetWidth);
}
示例
const selectEl:?HTMLElement=document.getElementById('someSelectElement');
//检查正确的类型(!null!未定义免费提供)
如果(选择HtmlSelect元素的EL实例){
const selectedVal=selectEl.options[selectEl.selectedIndex].value;
}
使用不变量的示例
从“不变量”导入不变量;
const videoContent=document.getElementById('video-player');
不变量(HTMLVideoElement的videoContent实例,“无视频元素”);
//使用视频api做一些事情
videoContent.volume=0;
plause();
  • 对于FlowType中的HtmleElement(以及HtmleElement的扩展,如VideoHtmleElement),我建议使用
    instanceof
    来验证类型并验证它是否为null

    另外,我认为您不需要检查是否存在在flow(1)中全局定义的
    文档*

    示例
    constmyidel:?HTMLElement=document.getElementById('myID');
    if(HtmleElement的myIdEl实例){
    //继续
    console.log(myIdEl.offsetWidth);
    }
    
    示例
    const selectEl:?HTMLElement=document.getElementById('someSelectElement');
    //检查正确的类型(!null!未定义免费提供)
    如果(选择HtmlSelect元素的EL实例){
    const selectedVal=selectEl.options[selectEl.selectedIndex].value;
    }
    
    使用不变量的示例
    从“不变量”导入不变量;
    const videoContent=document.getElementById('video-player');
    不变量(HTMLVideoElement的videoContent实例,“无视频元素”);
    //使用视频api做一些事情
    videoContent.volume=0;
    plause();