Расширение прототипа объекта в модуле ES6 дает свойство не существует для типа «объект» - PullRequest
0 голосов
/ 13 октября 2018

У меня есть два модуля - 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");
    } 
}

Если я прокомментирую LINE X в mod1.ts и скомпилирую его так: tsc --module ES2015 --target ES2015 mod1.ts, тогда все в порядке.Однако, если я раскомментирую LINE X и скомпилирую оба модуля: tsc --module ES2015 --target ES2015 mod1.ts mod2.ts я получу:

mod1.ts:7:18 - error TS2339: Property 'GetFooAsString' does not exist on type 'Object'.

7 Object.prototype.GetFooAsString = function () {
                   ~~~~~~~~~~~~~~

Как объяснить и исправить это?Я использую TypeScript 3.0.1

1 Ответ

0 голосов
/ 13 октября 2018

Интерфейс, который вы объявляете, не находится в глобальной области видимости, он находится в текущем модуле.Вам необходимо объявить его в глобальном формате:

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

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

Причина, по которой это происходит, заключается в том, что до тех пор, пока вы не добавите импорт или экспорт, файл считается простым сценарием, и все находится в глобальной области видимости.Когда вы добавляете импорт / экспорт, он становится модулем, и поэтому все находится в области видимости модуля.

...