在ES6模块中扩展对象原型给出了“对象”类型上不存在的属性

时间:2018-10-13 19:16:37

标签: typescript prototype

我有两个模块-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

1 个答案:

答案 0 :(得分:1)

您声明的接口不在全局范围内,而是在当前模块中。您需要在全局中声明它:

import { Test } from "./mod2"; //LINE X
declare global {
  interface Object {
    GetFooAsString(): string;
  }
}

Object.prototype.GetFooAsString = function () {
  return this.GetFoo().toString();
}

发生这种情况的原因是,在添加导入或导出之前,该文件被视为简单脚本,并且所有内容都在全局范围内。添加导入/导出后,它将成为一个模块,因此所有内容都将位于模块范围内。