在打字稿中使用浏览器特定属性的正确方法是什么?

问题描述 投票:0回答:1

具体来说,我想在 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
}

显示下划线的图像: typescript underlining missing property

那么为什么当我导出函数时声明合并不再起作用?我该怎么做才能去掉下划线?

附录1:

我注意到,如果我将 e 重新分配给自身,则不再有错误......什么?看: typescript code assigning error to itself

显然,将 e 赋值给 e 会将其从 Error 类型更改为“any”类型,从而消除了属性不存在错误。我本以为类型在本质上将其分配给自身时不会改变,但我想我的假设是错误的。

附录2:

我想我只会使用

// @ts-ignore
直到有人澄清向 Typescript 澄清属性 实际上可能可用的正确方法。

javascript typescript types error-handling cross-browser
1个回答
0
投票

显然我需要像这样在全球范围内声明它们:

// 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

这对我来说似乎是最合适的方法。

有这些类型的官方库吗?我找不到。

© www.soinside.com 2019 - 2024. All rights reserved.