元素隐式具有“任何”类型,因为类型“窗口”没有索引签名?

Posted

技术标签:

【中文标题】元素隐式具有“任何”类型,因为类型“窗口”没有索引签名?【英文标题】:Element implicitly has an 'any' type because type 'Window' has no index signature? 【发布时间】:2017-06-30 19:14:04 【问题描述】:

我正在尝试在 Typescript 中创建一个 Factory 类,但遇到以下错误:

src/ts/classes/Factory.ts(8,10):错误 TS7017:元素隐式具有“任意”类型,因为类型“窗口”没有索引签名。

我尝试搜索此错误,但没有看到与我想要做的完全匹配的任何内容。

以下是我的工厂类。

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

我宁愿不只是抑制编译器中的隐式错误。

任何建议或帮助将不胜感激!如果这不是最好的方法,我当然也愿意改变它。

【问题讨论】:

顺便说一句:根据 OOP 指南,这不是工厂。我不知道你在window 中存储了什么,但工厂应该根据一些输入创建对象,而不是从一些上帝对象中选择对象。整个方法只是调用window[className 的更冗长的语法,而且毫无意义。 这样的声音可能是xy problem。你想做什么? 谢谢,@k0pernikus。我想我试图让这变得比它需要的更复杂。 【参考方案1】:

另一种无需添加声明即可在窗口上建立索引的方法是将其转换为类型any

return (window as any)[className];

【讨论】:

我相信这是一个更好的解决方案。当您将[key:string] : any; 添加到我们的界面时,我们基本上不再对对Window 界面或您添加它的任何界面的调用进行任何类型检查。这不好,尤其是当使用 typescript 的目的是进行类型检查时。在这个答案的情况下,你基本上是在说,我知道 className 是窗口的一部分,所以我明确地将它转换为任何第一个......这不是很好,但它更好。我想知道是否有更好的解决方案。 我也认为这是一个比公认的解决方案更好的解决方案。考虑将此作为接受的答案。 这样做或接受的答案违背了打字稿的全部目的。而不是这样做,根本不要使用打字稿。【参考方案2】:

全局window 变量属于type Windowtype Window 没有 index signature,因此,打字稿无法推断 window[yourIndex] 的类型。

为了让你的代码通过,你可以将此接口添加到非模块文件中:

interface Window 
    [key:string]: any; // Add index signature

请注意,这将允许 任何 属性访问 window,例如window.getElmentById("foo") 将不再因拼写错误而成为错误。

旁注:从长远来看,依赖自定义修改的全局变量会带来麻烦,您也不想只为any 输入提示。打字稿的全部意义在于引用特定类型。 any 最好不要使用。你不应该弄乱全局命名空间,我也建议不要依赖全局窗口变量。

【讨论】:

不用declare var Window,直接interface Window [key: string]: any 即可 我在哪里可以阅读更多关于这种“新颖”语法[key:string] 的信息,它有谷歌搜索的名称吗? @DimitryK 它叫index signature @k0pernikus tnkx!这似乎很好地解释了它:basarat.gitbooks.io/typescript/docs/types/index-signatures.html "你不应该弄乱全局命名空间,我也建议不要依赖全局窗口变量。" -- 有时这是必要的,例如当回调函数名称作为查询参数传递给脚本 url 时(就像在几个 google apis 中所做的那样)。【参考方案3】:

可以试试

返回窗口[className as keyof WindowType];

【讨论】:

以上是关于元素隐式具有“任何”类型,因为类型“窗口”没有索引签名?的主要内容,如果未能解决你的问题,请参考以下文章

TS7053:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“用户经济”

TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型

TypeScript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型

元素隐式具有“任何”类型,因为字符串类型的表达式 | number 不能用于索引类型

如何使用命名数组的接口:元素隐式具有“任何”类型,因为索引表达式不是“数字”类型

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型 - Phaser