Как я могу устранить свойство глобального объекта, который скрыт объектом в пространстве имен?

106
10

Учитывая следующий код (код фрагмента) TypeScript 2.1:

namespace outerNS {
export function fnMain() {
assertTrue(overloadedIdentifierNS.fnToBeCalled() === "intended");
}
namespace overloadedIdentifierNS {
export function fnToBeCalled() {
return "unintended";
}
}
}

namespace overloadedIdentifierNS {
export function fnToBeCalled() {
return "intended";
}
}

function assertTrue(v: boolean) {
if (!v)
alert("fail!");
}

Как я могу получить доступ к глобальному перегруженномуIdentifier.fnToBeCalled изнутри внешнего NS?

спросил(а) 2021-01-19T20:31:56+03:00 2 месяца, 3 недели назад
1
Решение
106

Все глобальные свойства в браузере завертываются в объект Window, поэтому вы можете:

namespace outerNS {
export function fnMain() {
assertTrue(window.overloadedIdentifierNS.fnToBeCalled() === "intended");
}
...
}
...

Это будет работать во время выполнения, но компилятор будет жаловаться на то, что:

Свойство 'overloadedIdentifierNS' не существует в типе 'Window'

Поэтому вы можете сделать это вместо этого:

assertTrue(window["overloadedIdentifierNS"].fnToBeCalled() === "intended");

Или вы можете увеличить объект Window:

interface Window {
overloadedIdentifierNS: {
fnToBeCalled: () => string;
}
}

namespace outerNS {
export function fnMain() {
assertTrue(window.overloadedIdentifierNS.fnToBeCalled() === "intended");
}
...
}
...

ответил(а) 2021-01-19T20:31:56+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема