我有两个模块-mod1.ts和mod2.ts。
//mod1.ts
import {Test} from "./mod2"; //LINE X
interface Object {
GetFooAsString(): string;
}
Object.prototype.GetFooAsString = function () {
return this.GetFoo().toString();
}
//mod2.ts
export class Test {
test(): void {
console.log("Test");
}
}
如果我在mod1.ts上注释LINE X并通过以下方式进行编译:{{1}},那么一切正常。但是,如果我取消注释LINE X并编译两个模块:tsc --module ES2015 --target ES2015 mod1.ts
,我将得到:
tsc --module ES2015 --target ES2015 mod1.ts mod2.ts
如何解释和解决它?我使用TypeScript 3.0.1
答案 0 :(得分:1)
您声明的接口不在全局范围内,而是在当前模块中。您需要在全局中声明它:
import { Test } from "./mod2"; //LINE X
declare global {
interface Object {
GetFooAsString(): string;
}
}
Object.prototype.GetFooAsString = function () {
return this.GetFoo().toString();
}
发生这种情况的原因是,在添加导入或导出之前,该文件被视为简单脚本,并且所有内容都在全局范围内。添加导入/导出后,它将成为一个模块,因此所有内容都将位于模块范围内。