TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型
Posted
技术标签:
【中文标题】TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型【英文标题】:TypeScript: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 【发布时间】:2020-11-13 17:06:06 【问题描述】:我正在将我的 react 应用从 javascript 转换为 TypeScript 试图弄清楚如何解决以下错误
元素隐含地具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“计划”。 在“Schedule”类型上找不到带有“string”类型参数的索引签名。
这是代码...
export interface Schedule
display: Display;
monday: Day;
tuesday: Day;
wednesday: Day;
thursday: Day;
friday: Day;
saturday: Day;
sunday: Day;
export interface Diary
schedule: Schedule;
appointments: Array<Appointment>;
// ...
const dayKey: string = 'monday'
const day: Day = diary.schedule[dayKey] // <-- Here is the error
// ...
以前,由于我在 JavaScript 中使用的数据结构只是 json,因此这是一种享受,但我正在努力理解如何使用 TypeScript 实现同样的目标。
谢谢
【问题讨论】:
【参考方案1】:您可以为此使用 TypeScript 的 keyof
关键字:
const dayKey: keyof Schedule = 'monday'
【讨论】:
【参考方案2】:const dayKey: string = 'monday';
这上面的类型是string
,太笼统了。并非每个字符串在调度对象中都有一个条目。您和我都知道,当您执行 diary.schedule[dayKey]
时,唯一可能访问的是 "monday"
,但这在 typescript 正在使用的类型信息中不可用。
您有多个更具体类型的选项。您可以指定它是 Schedule 中的键之一:
const dayKey: keyof Schedule = 'monday';
或者您可以指定它专门为"monday"
const dayKey: 'monday' = 'monday';
另一种指定具体为"monday"
的方法如下:
const dayKey = 'monday' as const;
【讨论】:
以上是关于TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型的主要内容,如果未能解决你的问题,请参考以下文章
Typescript 元素隐式地具有任何类型,带有 for...in 循环
TypeScript - ts(7053):元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引
Object.keys 迭代导致 Typescript 错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型”