【发布时间】:2019-01-24 20:30:23
【问题描述】:
我正在尝试编写一个外部函数来使用 TypeScript 缩小对象的类型,但是一旦我将逻辑拉出 TypeScript 似乎就失去了线程。我有以下代码:
if (element instanceof HTMLInputElement && element.checked) {
// do something
}
但是,我想取消第一次结帐并向我们发送通知,告诉我们有什么事情发生了:
function assertType(element, expectedType) {
if (element instanceof expectedType) { return true; }
notify(`element ${element} wasn't expected type ${expectedType}`);
return false;
}
if (assertType(element, HTMLInputElement) && element.checked) {
// do something
}
TypeScript 对第一个很满意,但第二个却抱怨:
error TS2339: Property 'checked' does not exist on type 'HTMLElement'.
即使我将它减少到最低限度,它仍然会失败:
function assertType(element, expectedType) {
return element instanceof expectedType;
}
有没有办法可以编写 assertType 函数,以便 TypeScript 能够缩小类型?我试图避免进行类型转换以确保类型与底层 html 一致,但我想我可以在紧要关头使用它。甚至可能是这样的:
if (assertType(element, HTMLInputElement) && (element as HTMLInputElement).checked) {
// do something
}
【问题讨论】:
-
我见过这些,但是除非我遗漏了一些东西,否则它们看起来不支持任意类型。有没有一种方法可以做到这一点,而无需为我希望能够断言的每种类型提供单独的辅助函数?
标签: typescript