类型相同但全局声明仍然出错 "TS2717: Subsequent property declarations must have the same type with same type."

Same types but still error on global declaration "TS2717: Subsequent property declarations must have the same type with same type."

版本 13.2.1 的库 should 在 Node 8.9.1 上使用 TypeScript 2.7.1 编译时产生以下错误:

node_modules/should/should.d.ts(237,5): error TS2717: Subsequent property 
declarations must have the same type.  Property 'should' must be of type
 'Assertion', but here has type 'Assertion'.

即指向类型定义文件中的这一行:https://github.com/shouldjs/should.js/blob/9748ae607f80fbf544d4bb67db8e1e014de2301f/should.d.ts#L237

还有一个 issue in the should.js github repository 之前已经发现并认为可以解决这个问题。

简化错误生成文件

下面是产生相同错误的真实文件的简化版本:

declare namespace should {

  interface Assertion {
    assert(expr: boolean): this;
    fail(): this;
  }
}

declare global {
  interface Object {
    should: should.Assertion;
  }
}

export as namespace should;

export = should;

快速修复

一个简单的解决方案是跳过全局声明。这将满足我自己的库用例,但由于库目前打算允许这个用例,它似乎不是一个理想的场景。

问题

为什么这个声明不起作用?什么才是有效的声明?

编辑

测试相关依赖项,一些涉及全局类型定义并可能发生冲突。

{
      "devDependencies": {
        "@types/chai": "^4.1.2",
        "@types/chai-as-promised": "^7.1.0",
        "@types/mocha": "^2.2.48",
        "@types/proxyquire": "^1.3.28",
        "@types/request-promise": "^4.1.41",
        "@types/sinon": "^4.1.3",
        "@types/sinon-chai": "^2.7.29",
        "@types/supertest": "^2.0.0",
        "chai": "^4.0.0",
        "chai-as-promised": "^7.1.1",
        "chai-things": "^0.2.0",
        "mocha": "^3.4.2",
        "nyc": "^11.4.1",
        "proxyquire": "^1.8.0",
        "should": "^13.2.1",
        "sinon": "^4.2.2",
        "sinon-chai": "^2.14.0",
        "sinon-mongoose": "^2.0.2",
        "supertest": "^1.2.0"
      }
 }

如果一个定义已经将 Assertion 接口全局分配给 Object.should(如果您被告知要进行后续声明,则它必须具有)...

如果您扩展了原始 Assertion 界面....

那么你不需要在全局声明中重新指定接口。

为什么?

当您在同一个公共根中编写多个接口定义时,它们都属于一个类型。这意味着您对接口的添加被包括在同一个代码块中。

错误

如果您收到您提到的错误,或者如果您看不到您认为已添加到接口的类型信息,那是因为您没有找到相同的公共根,即接口存在在 X.Y.Z 中,但您已将其添加到 X.Y