覆盖命名空间中 TypeScript 库提供的类型?

Jam*_*ook 8 typescript

有没有办法覆盖 TypeScript 包导出和使用的类型的值?

所以我的打字文件中有这个:

// index.d.ts
declare module 'my-package' {
    namespace DependencyInjection {
        type ServiceID = 'myServiceOne' | 'myServiceTwo'; // original type is "any";
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Duplicate identifier 'ServiceID'.ts(2300)
inject.ts(44, 10): 'ServiceID' was also declared here.
Run Code Online (Sandbox Code Playgroud)

我希望能够替换ServiceID使用代码中的类型。能做到吗?我知道接口可以扩展,但我还没有找到更改或更新类型的方法。

语境

我正在编写一个 TypeScript 包,我希望用户在集成该包时能够用自己的类型覆盖一些默认类型,而不是每次使用某些方法时都必须提供泛型。

小智 4

仅当模块可扩展时,模块扩充才有效。类型无法扩展,但接口可以。

declare module 'my-package' {
    namespace DependencyInjection {
        interface ServiceIDMap {}
        type ServiceID = keyof ServiceIDMap
    }
}

declare module 'my-package' {
    namespace DependencyInjection {
        // insert your keys in here.
        interface ServiceIDMap {
            myServiceOne: unknown
            mySevriceTwo: unknown
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

@types/jest也旨在通过ts-jest扩展Config.InitialOptions.globals结构来做到这一点。