Flow:HTMLVideoElement和HTMLElement

时间:2017-07-12 19:08:11

标签: javascript casting flowtype

我正在使用Flow来检查我的应用。

我有一个dom节点,我必须使用 $count = 0; $result = $sia_db_con->query("SELECT `ip_address` FROM `ip4` WHERE `ip_ban_active`='True' ORDER BY ip4.added ASC"); while ($row = $result->fetch_array()) { $pos = strpos($row[0], "/"); $ip_arr = [0 => substr($row[0], 0, $pos), 1 => substr($row[0], $pos+1)]; $start = cidr2ip($ip_arr)[0]; $end = cidr2ip($ip_arr)[1]; $count = $count + (ip2long($end) - ip2long($start)) + 1; } unset($result, $row, $pos, $ip_arr, $start, $end, $range); function cidr2ip($cidr) { $start = ip2long($cidr[0]); $nm = $cidr[1]; $num = pow(2, 32 - $nm); $end = $start + $num - 1; $range = [0 => $cidr[0], 1 => long2ip($end)]; unset($start, $nm, $num, $end); return $range; } 手动拉取。在Flow的眼中,这会返回document.querySelector。它实际上返回了一个视频元素,我将其视为HTMLElement

我试图施展它,但它仍然出错。我做错了什么?



HTMLVideoElement

let videoElement: HTMLVideoElement;
videoElement = document.querySelector('video') // type is HTMLElement, errors out.




我得到的错误是<video class="lol"></video>

2 个答案:

答案 0 :(得分:2)

您的错误与视频无关。如果你看the type definition for querySelector('video'),那就是

querySelector(selector: 'video'): HTMLVideoElement | null;

如果仔细观察, 与您在变量上添加的类型不兼容。 querySelector可以返回null而您忽略了这一事实。 Flow正在捕捉潜在的错误,让你验证和处理错误的情况,这是它的全部工作。

所以你有几个选择

  1. 使用null对其进行注释,并检查何时使用该变量来处理它,例如

    let videoElement: HTMLVideoElement | null  = document.querySelector('video');
    
  2. 明确检查并抛出流量可以知道您想要它出错,例如

    let result = document.querySelector('video');
    if (!result) throw new Error("Video not found");
    
    // Technically you don't need to reassign and you can reuse 
    // 'result' but I'm doing it for clarity.
    let videoElement: HTMLVideoElement = result;
    
  3. 告诉Flow您100%确定它始终会使用any

    找到视频
    let videoElement: HTMLVideoElement = (document.querySelector('video'): any);
    
  4. 明确告诉流程忽略该行的错误。在.flowconfig

    [options]
    suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore
    

    然后在你的代码中做

    let videoElement: HTMLVideoElement;
    
    // $FlowIgnore
    videoElement = document.querySelector('video');
    

答案 1 :(得分:0)

我只是通过黑客攻击类型系统,将其转换为any,然后将其重新转换为HTMLVideoElement来实现它。

      videoElement = ((document.querySelector('video'): any): HTMLVideoElement);