如何防止出现错误“编译打印机的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 }; }