Typescript 元素隐式具有“any”类型,因为类型“Window”没有索引签名?

Typescript 元素隐式具有“any”类型,因为类型“Window”没有索引签名?,typescript,Typescript,我试图在Typescript中创建工厂类,但遇到以下错误: src/ts/classes/Factory.ts8,10:错误TS7017:元素隐式具有“any”类型,因为类型“Window”没有索引签名 我试图搜索这个错误,但没有看到任何与我想要做的完全匹配的东西 下面是我的工厂课程 /** * @class Factory * * @description Returns object based on given class string */ class Factory {

我试图在Typescript中创建工厂类,但遇到以下错误:

src/ts/classes/Factory.ts8,10:错误TS7017:元素隐式具有“any”类型,因为类型“Window”没有索引签名

我试图搜索这个错误,但没有看到任何与我想要做的完全匹配的东西

下面是我的工厂课程

/**
 * @class Factory
 *
 * @description Returns object based on given class string
 */
class Factory {
    public class(className: string): any {
        return window[className];
    }
}
我宁愿不只是抑制编译器中的隐式错误

任何建议或帮助都将不胜感激!如果这不是执行此操作的最佳方式,我当然也愿意更改它。

全局窗口变量的类型为window。类型窗口没有,因此,typescript无法推断窗口[yourIndex]的类型

要使代码通过,可以将此接口添加到非模块文件:

interface Window {
    [key:string]: any; // Add index signature
}
请注意,这将允许对窗口进行任何属性访问,例如,window.getElmentByIdfoo将不再是由于输入错误而导致的错误


旁注:从长远来看,依赖自定义修改的全局变量会带来麻烦,您也不希望只为任何问题输入提示。typescript的全部目的是引用特定的类型。最好不要使用任何一个。您不应该弄乱全局名称空间,我还建议不要依赖全局窗口变量。

另一种在窗口上建立索引而不必添加声明的方法是将其强制转换为任何类型:

也许试试

返回窗口[类名称作为WindowType的键]


顺便说一句:根据OOP指南,这不是一个工厂。我不知道你在窗口中存储了什么,但是工厂应该根据一些输入创建对象,而不是从一些上帝对象中选择对象。整个方法只是一个更详细的语法,只调用window[className],这是毫无意义的。像这样的Souns可能是一个。你想做什么?谢谢,@k0pernikus。我想我是想让它比需要的更复杂。不需要声明var window,你可以简单地执行接口window{[key:string]:any}在哪里可以阅读更多关于这种新颖语法的信息[key:string]它有谷歌名称吗?@DimitryK它叫索引signature@k0pernikustnkx!这似乎很好地解释了这一点:您不应该弄乱全局名称空间,我还建议不要依赖全局窗口变量。-但有时这是必要的,例如,当回调函数名作为查询参数传递给脚本时url是在几个google API中完成的。我相信这是一个更好的解决方案。当您添加[key:string]:any;对于我们的接口,我们基本上不再对窗口接口的调用进行任何类型检查,或者无论您将其添加到哪个接口。这都不好,尤其是当使用typescript的目的是进行类型检查时。在这种情况下,您基本上是说,我知道类名是窗口的一部分,所以我显式地使用casti这是不好的,但不是更好,我想知道是否还有更好的解决办法。我也认为这是一个比接受的更好的解决方案。考虑把这当作一个被接受的答案。做这个或被接受的答案破坏了打字稿的全部目的。而不是这样做,根本不用打字稿。
return (window as any)[className];