如何防止出现错误“编译打印机的noImplicitAny标志启用时,对象types的索引签名隐式地具有”任何“types”?

我总是用flag –noImplicitAny编译Typescript。 这是有道理的,因为我想我的types检查尽可能紧。

我的问题是,与下面的代码我得到的错误Index signature of object type implicitly has an 'any' type

 interface ISomeObject { firstKey: string; secondKey: string; thirdKey: string; } let someObject: ISomeObject = { firstKey: 'firstValue', secondKey: 'secondValue', thirdKey: 'thirdValue' }; let key: string = 'secondKey'; let secondValue: string = someObject[key]; 

重要的是要注意的是,这个想法是,关键的variables来自应用程序的其他地方,可以是对象中的任何键。

我已经尝试明确铸造的types:

 let secondValue: string = <string>someObject[key]; 

或者,我的情况是不可能的--noImplicitAny

添加索引签名将使TypeScript知道types应该是什么。

在你的情况下,将[key: string]: string;

 interface ISomeObject { firstKey: string; secondKey: string; thirdKey: string; [key: string]: string; } 

但是,这也会强制所有的属性types匹配索引签名。 由于所有的属性是一个string它的工作原理。

虽然索引签名是描述数组和'字典'模式的强大方法,但它们也强制所有属性匹配它们的返回types。

编辑:

如果types不匹配,则可以使用联合types[key: string]: string|IOtherObject;

对于联合types,如果让TypeScript推断types而不是定义它,则会更好。

 // Type of `secondValue` is `string|IOtherObject` let secondValue = someObject[key]; // Type of `foo` is `string` let foo = secondValue + ''; 

尽pipe如果在索引签名中有许多不同的types,这可能会变得杂乱无章。 另一种方法是使用签名中的any[key: string]: any; 那么你需要像上面那样投出types。

另一种避免错误的方法是像这样使用投射:

let secondValue: string = (<any>someObject)[key]; (注意括号)

唯一的问题是,这是不是types安全的,因为你正在铸造any 。 但是你总是可以回到正确的types。

PS:我正在使用打字稿1.7,不知道以前的版本。

以下tsconfig设置将允许您忽略这些错误 – 将其设置为true。

suppressImplicitAnyIndexErrors

为索引缺less索引签名的对象禁止noImplicitAny错误。

像这样声明对象。

 export interface Thread { id:number; messageIds: number[]; participants: { [key:number]: number }; }