Как объявить новое свойство объекта Window с Typescript

В Javascript объявление нового свойства в любом объекте очень просто, и есть даже 2 способа сделать это:

// Declare programatically
window.MyProperty = function(){
alert("Hello World");
};
// Declare with Brackets
window["MyProperty"] = function(){
alert("Hello World");
};

Переменная Window — это объект, поэтому, чтобы объявить новое свойство в объекте Window с Javascript, мы просто использовали бы предыдущий фрагмент, и все будет работать как шарм. Однако в Typescript, который не будет работать … по крайней мере, во время компиляции и в вашей проверке синтаксиса IDE (если он поддерживает TypeScript), вы должны увидеть следующее предупреждение:

[TS] Свойство ‘MyProperty’ не существует для типа ‘Window’

Ошибка действительно очень проста. Чтобы понять это, мы собираемся использовать следующий класс TypeScript, класс DeviceInfo:

class DeviceInfo {
setInfo(){
console.log("This is just a demo ...");
}
}
let info = new DeviceInfo();
// The following line should throw the error:
// Property 'name' does not exist on type 'DeviceInfo'
info.name = "BatPhone";

Чтобы устранить ошибку, нам просто нужно добавить свойство name к DeviceInfo класс и все тут

class DeviceInfo {
name: string;
setInfo(){
console.log("This is just a demo ...");
}
}
let info = new DeviceInfo();
// No more warning !
info.name = "BatPhone";

Очень легко решить в пользовательском объекте, созданном вами, но, Window это не ваш класс … это уже встроенный объект в браузере! Тогда как правильно добавить новое свойство к объекту Window в машинописи?

Объявление нового свойства в окне

В зависимости от способа кодирования и используемой версии TypeScript существует два способа добавить новое свойство в окно:

1. С интерфейсом

Чтобы добавить новое свойство и предотвратить любую ошибку компиляции, вы можете использовать интерфейс для описания окна с вашим новым свойством. В TypeScript интерфейсы выполняют роль именования типов и являются мощным способом определения контрактов в вашем коде. как контракты с кодом за пределами вашего проекта.

Поскольку целью интерфейса является только описание типа или объекта (они не будут перенесены в Javascript), вы можете создать интерфейс для описания окна и добавить в качестве нового свойства имя вашего свойства и ошибку, которая должна больше не появляется:

interface Window {
MyProperty: any;
}
window.MyProperty = 12345;
// as the type of MyProperty is any, you can change the value
// for the value you want, or specify a different type according
// to your needs :)

В следующих примерах показано, как объявлять разные свойства в объекте Window с использованием интерфейса с разными типами:

interface Window {
CustomNumber: number;
CustomFunction: Function;
CustomString: string;
CustomAnything: any;
}
window.CustomNumber = 123;
window.CustomFunction = () => {
console.log("Hello World");
};
window.CustomString = "TypeScript";
window.CustomAnything = {
hello: 12,
world: 21
};

2. Держите ваш код динамичным

Если вы не хотите заботиться о типах, вы можете просто использовать следующий синтаксис для создания нового свойства:

(window).MyPropertyName = "Something";

В следующем примере показано, как объявить различные типы в окне:

(window).CustomFunction = () => {
alert("Hello World");
};
(window).CustomNumber = 123;
(window).CustomString = "Code";
Ссылка на основную публикацию
Adblock
detector