私の例では、fetch
のポリフィルを含めるようにTSウィンドウインターフェイスを拡張しようとしています。どうでもいいんです。問題は、「TSにwindow.fetch
は有効な関数ですか? "
TS v.1.5(IIRC)を実行しているVS Code v.0.3.0でこれを行っています。
使用したいTSクラスファイル内のインターフェイスを宣言しても機能しません。
///<reference path="typings/tsd.d.ts"/>
interface Window {
fetch:(url: string, options?: {}) => Promise<any>
}
...
window.fetch('/blah').then(...); // TS objects that window doesn't have fetch
しかし、この同じインターフェイスを別の ".d.ts"ファイルで宣言して、TSクラスファイルで参照しても問題ありません。
これが「typings/window.extend.d.ts」です
///<reference path="es6-promise/es6-promise"/>
interface Window {
fetch:(url: string, options?: {}) => Promise<any>
}
これで、TSクラスファイルで使用できます。
///<reference path="typings/window.extend.d.ts"/>
...
window.fetch('/blah').then(...); // OK
または、TSクラスファイルに拡張インターフェイス別の名前を記述して、キャストで使用することもできます。
interface WindowX extends Window {
fetch:(url: string, options?: {}) => Promise<any>
}
...
(<WindowX> window).fetch('/blah').then(...); // OK
インターフェイスの拡張が「d.ts」で機能するが、機能しない理由in sit?
本当にこれらの旋回を行わなければならないのですか?
declare global
が必要です
declare global {
interface Window {
fetch:(url: string, options?: {}) => Promise<any>
}
}
これはその後機能します:
window.fetch('/blah').then(...);
トップレベルのimport
またはexport
がファイルにある場合(この問題が発生するにはどこかにある必要があります)、ファイルは外部モジュールです。
外部モジュールでは、インターフェースを宣言すると、既存のグローバルインターフェースが拡張されるのではなく、常に新しいタイプが作成されます。これは、モジュールローダーの一般的な動作を模倣します。このファイルで宣言されたものは、グローバルスコープ内のものとマージまたは干渉しません。
この旋回の理由は、そうしないと、外部モジュールで、グローバルスコープと同じ名前の新しい変数または型を定義する方法がないためです。