【发布时间】:2017-11-08 08:41:55
【问题描述】:
到目前为止,我很喜欢 typescript,但发现我需要做很多类型断言。例如,将 EventTarget 转换为 HTMLAnchorElement 对我来说是一个常见的用例。但是要做到这一点,我需要使用以下内容:
getTabID(eventTarget: EventTarget) : string {
// without the following variable, the compiler tells me that .hash
// is not a property of EventTarget, which according to the interface, it isn't.
// So thats fine, i'll cast it to an Element
let mEventTarget: HTMLAnchorElement = <HTMLAnchorElement>eventTarget
let mTabID: string
if(mEventTarget.hash){
mTabID = mEventTarget.hash.split('#')[1]
}
return mTabID
}
然而,这意味着如果我不希望编译器抛出错误,我需要在我的函数中创建变量来进行类型断言。我不介意额外的输入,但这些最终也会出现在 JS 中,最终会在我的 js 文件中浪费字节。
我希望能够做到以下几点:
getTabID(eventTarget: EventTarget) : string {
let mTabID: string
// Do the type assertion in the parameter
if(<HTMLAnchorElement> eventTarget.hash){
mTabID = mEventTarget.hash.split('#')[1]
} else {
mTabID = mEventTarget.dataset.tabId
}
return mTabID
}
我已经很好地查看了文档和 SO,但似乎找不到任何方法来做到这一点。有人有什么想法吗?
【问题讨论】:
-
如果你确定
eventTarget永远是HTMLAnchorElement,为什么不在参数中声明eventTarget: HTMLAnchorElement并强制getTabID的调用者确保它是HTMLAnchorElement? -
您可以使用
eventTarget: EventTarget | HTMLAnchorElement作为类型,这样可以同时启用 EventTarget 和 HTMLAnchorElement 作为类型。 -
@Saravana 因为当我调用该函数时,调用者会抛出一个错误,指出您无法将
EventTarget传递给需要HTMLAnchorElement的函数。 @Wernerson 我想这会阻止错误,但似乎是个 hack。 -
@C02Equinox 关键是您可以在调用者端进行断言。喜欢
getTabID(target as HTMLAnchorElement)。如果这一切感觉很麻烦,我只需键入参数any:(eventTarget: any)即可关闭类型检查。 -
哦,太棒了!我曾尝试使用
as语法,但不知道在哪里使用它。完美的!谢谢!
标签: typescript parameters type-assertion