2017-02-12 235 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

相关问题