具体来说,我想在 FireFox 中的 Error 对象上使用“fileName”和其他额外属性。
但是这样的东西给了我红色下划线,我可以简单地忽略它,但这让我很困扰。 我试过了
function normalizeError(e:Error|ErrorEvent|PromiseRejectionEvent|any) {
if(e instanceof Error){
return {
line: e?.fileName //underlined
}
}else return null
}
这是有下划线的,因为 fileName 是一个仅在浏览器子集中找到的属性,并且它没有标准化,但它位于我在参数类型中指定的 Error 对象上。
使用声明合并修改接口有点......
interface Error {
fileName?: string
}
function normalizeError(e:Error|ErrorEvent|PromiseRejectionEvent|any) {
if(e instanceof Error){
return {
line: e?.fileName // Not-underlined
}
}else return null
}
但是..当我导出函数时,它再次强调它?...为什么?
interface Error {
fileName?: string
}
// Exported now:
export function normalizeError(e:Error|ErrorEvent|PromiseRejectionEvent|any) {
if(e instanceof Error){
return {
line: e?.fileName // underlined again
}
}else return null
}
那么为什么当我导出函数时声明合并不再起作用?我该怎么做才能去掉下划线?
附录1:
我注意到,如果我将 e 重新分配给自身,则不再有错误......什么?看:
显然,将 e 赋值给 e 会将其从 Error 类型更改为“any”类型,从而消除了属性不存在错误。我本以为类型在本质上将其分配给自身时不会改变,但我想我的假设是错误的。
附录2:
我想我只会使用
// @ts-ignore
直到有人澄清向 Typescript 澄清属性 实际上可能可用的正确方法。
显然我需要像这样在全球范围内声明它们:
// global.d.ts
export {} // Exporting something is required
declare global {
interface Error {
/** Mozilla specific */
lineNumber?:number,
/** Mozilla specific */
columnNumber?: number,
/** Mozilla specific */
fileName?: string,
}
}
这个方法可以在这里找到: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-modifying-module-d-ts.html
这对我来说似乎是最合适的方法。
有这些类型的官方库吗?我找不到。