我正在使用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>
。
答案 0 :(得分:2)
您的错误与视频无关。如果你看the type definition for querySelector('video')
,那就是
querySelector(selector: 'video'): HTMLVideoElement | null;
如果仔细观察, 与您在变量上添加的类型不兼容。 querySelector
可以返回null
而您忽略了这一事实。 Flow正在捕捉潜在的错误,让你验证和处理错误的情况,这是它的全部工作。
所以你有几个选择
使用null
对其进行注释,并检查何时使用该变量来处理它,例如
let videoElement: HTMLVideoElement | null = document.querySelector('video');
明确检查并抛出流量可以知道您想要它出错,例如
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;
告诉Flow您100%确定它始终会使用any
let videoElement: HTMLVideoElement = (document.querySelector('video'): any);
明确告诉流程忽略该行的错误。在.flowconfig
做
[options]
suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore
然后在你的代码中做
let videoElement: HTMLVideoElement;
// $FlowIgnore
videoElement = document.querySelector('video');
答案 1 :(得分:0)
我只是通过黑客攻击类型系统,将其转换为any
,然后将其重新转换为HTMLVideoElement
来实现它。
videoElement = ((document.querySelector('video'): any): HTMLVideoElement);