类型相同但全局声明仍然出错 "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
。
版本 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
。