2017-02-12 15 views
15

私は活字体でファクトリクラスを作成しようとしているが、次のエラーに実行しているよ:タイプ 'Window'にインデックス署名がないため、要素に暗黙的に 'any'型がありますか?

src/ts/classes/Factory.ts(8,10): error TS7017: Element implicitly has an 'any' type because type 'Window' has no index signature.

私はこのエラーを探してみましたが、非常に私はしたいよ何マッチ何も表示されませんでした行う。

以下は私のFactoryクラスです。

/** 
* @class Factory 
* 
* @description Returns object based on given class string 
*/ 
class Factory { 
    public class(className: string): any { 
     return window[className]; 
    } 
} 

私はむしろコンパイラの暗黙的なエラーを抑制することはできません。

ご意見やご協力をいただければ幸いです。これが最善の方法ではない場合は、私もそれを変更することができます。

+0

ところで:これは、OOPのガイドラインに従って工場ではありません。私はあなたが 'window'の中に何を格納しているのかわかりませんが、工場はいくつかの入力に基づいてオブジェクトを作成し、いくつかの神オブジェクトからオブジェクトを選択する必要はありません。この全体のメソッドは単に 'window [className']を呼び出すより冗長な構文です。 – k0pernikus

+1

このようなサウンズは[xy問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)かもしれません。あなたは何をしようとしているのですか? –

+0

ありがとう、@ k0pernikus。私はこれを必要以上に複雑にしようとしていたと思う。 – abkothman

答えて

19

変数windowは、type Windowです。 type Windowにはインデックスシグニチャがないため、typescriptはwindow[yourIndex]のタイプを推論できません。

Windowの定義がtypescript's lib.d.tsから来ている:

declare var Window: { 
    prototype: Window; 
    new(): Window; 
} 

あなたのコードに合格するためには、の線に沿って何かが必要になります:

declare var Window: { 
    [key:string]: any; // missing index defintion 
    prototype: Window; 
    new(): Window; 
} 

追記:カスタム修正グローバル変数に頼ります長期的には問題を抱えているのですが、anyのためだけにヒントを書こうとはしません。タイプコピーの全体のポイントは、特定のタイプを参照することです。 anyを使用しないでください。グローバルな名前空間を混乱させるべきではありません。また、グローバルなウィンドウ変数に頼らないように助言します。

+8

'var Window'を宣言する必要はありません。単に' interface Window {[key:string]:any} 'を実行することができます。 –

+1

この「新規」構文' [key:string] 'の詳細はどこで読むことができますか? googlableな名前はありますか? –

+2

@DimitryKそれは 'インデックス署名 'と呼ばれています – k0pernikus

9

ウィンドウ上のインデックスへのもう一つの方法は、宣言を追加することなく、anyを型にキャストすることです:

return (window as any)[className]; 
+0

私はこれがより良い解決策であると信じています。 '[key:string]:any;'を私たちのインターフェースに追加すると、基本的にWindowインターフェースへの呼び出しやこれを追加するインターフェースの型チェックがなくなります。これは、特にtypescriptを使用している点が型チェックをする場合にはあまり良くありません。この答えの場合、基本的にはclassNameがウィンドウの一部であることを知っているので、最初に明示的にキャストしています...それは素晴らしいことではありませんが、それは良い方法です。もっと良い解決策があるのだろうかと思います。 – clu

関連する問題