我有一些使用类型保护功能的代码:
function assertInstanceOf<T>(
value: any,
expected_type: new(...args: any[]) => T,
): value is T {
if (value instanceof expected_type) { return true; }
notify(`value '${value}' was not expected type '${expected_type.name}'`);
return false;
}
在以下情况下,类型防护似乎不会粘住:
const save_sig_check = $modal.find('#save_signature')[0];
const is_html_input_element =
save_sig_check && assertInstanceOf(save_sig_check, HTMLInputElement);
if (is_html_input_element && save_sig_check.checked) {
this.saveSignatureData(name, output);
}
TypeScript报告:
error TS2339: Property 'checked' does not exist on type 'HTMLElement'.
113 if (is_html_input_element && save_sig_check.checked) {
~~~~~~~
但是,如果我这样重新排列代码,TypeScript不会抱怨:
if (!save_sig_check || !assertInstanceOf(save_sig_check, HTMLInputElement)) {
return true;
}
if (save_sig_check.checked) {
this.saveSignatureData(name, output);
}
我很难读第二本书,所以想知道为什么第一本书不起作用。有任何想法吗?仍在使用TypeScript 2.8.3。