TypeScript 拡張ウィンドウ

Migel Hewage Nimesha 2024年2月15日
  1. TypeScript window オブジェクト
  2. TypeScript の window オブジェクトで新しいプロパティを宣言する
  3. TypeScript でのインターフェイス宣言のマージ
TypeScript 拡張ウィンドウ

この記事では、TypeScript の window を拡張する方法を説明します。

TypeScript window オブジェクト

window は、ブラウザで定義された組み込みオブジェクトです。これは、DOM ドキュメントを含む window オブジェクトです。

ブラウザの window オブジェクトに関連付けられているプロパティと関数にアクセスする必要がある場合があります。組み込みの window オブジェクトは、すぐに使用できる多くの便利なプロパティと関数を備えています。

頻繁に使用される window オブジェクトのプロパティと関数の一部を以下に示します。

  1. プロパティ:EventTargetdocumentconsoleeventlocalStorageonLoad など。
  2. メソッド:addEventListenerfetchalertatobbtoaopenpromptprint など。

通常、TypeScript はさまざまなモジュールでそのタイプを定義します。したがって、window タイプは lib.dom モジュールで定義されます。

一部のシナリオでは、組み込みのメソッドとプロパティでは不十分です。TypeScript プロジェクトで Google Analytics または Tag Manager ライブラリを使用する場合は常に、これらのスクリプトがコードによって読み込まれない可能性があります。

したがって、window オブジェクトのプロパティとメソッドを介してこれらのサードパーティツールと通信する方法が必要です。

TypeScript の window オブジェクトで新しいプロパティを宣言する

JavaScript では、組み込みの window オブジェクトで新しいプロパティまたはメソッドを宣言するのは非常に簡単です。次の方法を使用して、JavaScript を使用して window オブジェクトに新しいプロパティを定義できます。

window.myProp = 'newly declared property';
window['myProp'] = 'newly declared property';

ブラウザコンソールで window オブジェクトを調べてみましょう。

console.log(window);

出力:

javascript で新しいプロパティを宣言します

TypeScript では、上記のアプローチは機能しません。JavaScript のように window オブジェクトで新しいプロパティを宣言しようとすると、次のように TypeScript がエラーをスローします。

window.anotherNewProp = 'this is a property on window object in typescript';

出力:

typescript で新しいプロパティを宣言する

通常、TypeScript オブジェクトタイプはクラスまたはインターフェイスに基づいています。次のように、Animal というクラスがあるとします。

class Animal {
    name: string;
    color: string;
}

Animal オブジェクトを作成し、name プロパティと color プロパティにいくつかの値を割り当てましょう。

class Animal {
    name: string;
    color: string;
}

let newAnimal = new Animal();

newAnimal.name = 'lion';
newAnimal.color = 'grey';

上記のコードは問題なくコンパイルされます。

次に、同じ Animal オブジェクトで新しいプロパティ numberOfLegs を宣言し、値を割り当てようとします。

class Animal {
    name: string;
    color: string;
}

let newAnimal = new Animal();

newAnimal.name = 'lion';
newAnimal.color = 'grey';
newAnimal.numberOfLegs = 4;

エラーがオブジェクトの新しいプロパティを宣言します

エラーが発生します。TypeScript でそのような新しいオブジェクトプロパティを宣言することはできません。

これを解決するには、最初に numberOfLegs プロパティを Animal クラスに追加する必要があります。

これは、組み込みの window オブジェクトでも同じ問題です。主な懸念事項は、TypeScript window オブジェクトが自分で作成されていないことです。

ブラウザが付属しています。したがって、この組み込みオブジェクトにプロパティを追加する適切な方法が必要です。

TypeScript でのインターフェイス宣言のマージ

TypeScript は、すぐに使用できる宣言マージ手法をサポートしています。最も単純なタイプの宣言のマージは、インターフェイスのマージです。

複数のインターフェースが同じ名前で宣言されるときはいつでも、TypeScript はすべてのインターフェース宣言を 1つにマージします。

組み込みの window オブジェクトは、TypeScript の window インターフェースに基づいています。したがって、TypeScript インターフェイスのマージ手法を使用して、組み込みのインターフェイスに新しいプロパティを追加できます。

window という名前の新しいインターフェースを作成しましょう。

interface Window {
    myProp: string;
}

次に、window オブジェクトの myProp プロパティにアクセスしてみます。

interface Window {
    myProp: string;
}

window.myProp = 'typescript window object property';

出力:

TypeScript でのインターフェイス宣言のマージ

今回、TypeScript コンパイラによって発生する問題はありません。タイプを検討する場合は、window オブジェクトで新しいプロパティまたはメソッドを定義することをお勧めします。

型に関係がない場合は、次の構文を使用して、window オブジェクトの新しいプロパティを宣言できます。

(<any>.window).myProp = 'typescript property on window object';

関数を宣言することもできます。

(<any>.window).NewFunction = () => {
    console.log('new function on window object');
}

TypeScript で両方の手法を使用して、window オブジェクトに新しいプロパティまたはメソッドを追加できます。選択はコンテキストに基づいてあなた次第です。

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.