2017-02-12 60 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.

我試圖尋找這個錯誤,但沒有看到任何東西,相當匹配,我想什麼做。

以下是我的工廠類。

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

我寧願不只是壓制編譯器中的隱含錯誤。

任何建議或幫助將不勝感激!如果這不是做這件事的最好方式,我肯定會改變它。

+0

BTW:這不是一個工廠按照OOP的指導方針。我不知道你在'window'中存儲了什麼,但工廠應該根據某些輸入創建對象,而不是從某些神對象中選擇對象。這整個方法只是簡單地調用'window [className'而不是毫無意義的語法。 – k0pernikus

+1

像這樣的可能是[xy問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你想做什麼? –

+0

謝謝,@ k0pernikus。我認爲我試圖讓這個過程比需要的更復雜。 – abkothman

回答

19

全局window變量爲type Windowtype 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]'的知識,有可用的名字嗎? –

+2

@DimitryK它被稱爲'索引簽名' – k0pernikus

9

另一種方式對窗口索引,無需再添加一個聲明,就是要投它鍵入any

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

我相信這是一個更好的解決方案。當你向我們的接口添加'[key:string]:any;'時,我們基本上不再有任何類型的對Window接口調用的檢查,或者你添加到這個接口的任何接口。當使用打字稿的目的是進行類型檢查時,這並不好。在這個答案中,你基本上是說,我知道className是窗口的一部分,所以我明確地將它轉換爲任何第一個...它不是很好,但它更好。我想知道是否有更好的解決方案。 – clu

相關問題