如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?
Posted
技术标签:
【中文标题】如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?【英文标题】:how to handle Typescript error Object.ts (7053) in newer version of typescript? 【发布时间】:2022-01-24 06:07:06 【问题描述】:我的代码功能在我以前的项目之一中运行良好,当我尝试将它复制到另一个项目时,它开始给我以下错误。我不知道这是什么意思。有人可以建议需要进行哪些更改才能使其正常工作
我的第一个猜测是 TS 版本或 tslint。
元素隐含地具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“对象”。 在“对象”类型上找不到带有“字符串”类型参数的索引签名。ts(7053)
private convertDates(object: Object)
if (!object || !(object instanceof Object))
return;
if (object instanceof Array)
for (const item of object)
this.convertDates(item);
var dateRegex = /^(\d4)-(\d2)-(\d2)T(\d2):(\d2):(\d2(?:\.\d*)?)$/; ///^\d4-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/;
for (const key of Object.keys(object))
const value = object[key];
if (value instanceof Array)
for (const item of value)
this.convertDates(item);
if (value instanceof Object)
this.convertDates(value);
if (typeof value === 'string' && dateRegex.test(value))
object[key] = new Date(value);
【问题讨论】:
【参考方案1】:您收到此错误是因为 Typescript 在新版本中变得更加严格。
关于 Typescript docs 本身,您不应该使用 Object
来键入对象:
永远不要使用类型 Number、String、Boolean、Symbol 或 Object 这些类型指的是在 javascript 代码中几乎从未正确使用过的非原始装箱对象。
Typescript 建议改用 object
类型,但您会在控制台中遇到同样的错误。
因此,您可以创建一个适当的接口作为对象的类型,也可以使用类型Record<Keys, Type>
(更多here)
构造一个对象类型,其属性键为 Keys,其属性值为 Type。此实用程序可用于将一种类型的属性映射到另一种类型。
你的函数应该是这样的:
private convertDates(object: Record<string, any>)
...
我知道,any
也被认为是一种不好的做法,因此请使用适当的类型;)
【讨论】:
【参考方案2】:问题是Object.keys(object)
返回string[]
而不是(keyof typeof object)[]
。并且 TS 无法确定任何 string
都可以用于索引 object
(例如,object['thisdoesnotexist']
不起作用)。
关于这是预期的 TS 行为的原因,请阅读this answer
要修复它,要么使用Object.entries()
同时获取键和值,要么将key
转换为keyof typeof object
,如下所示:
const value = object[key as keyof typeof object];
这明确告诉 TS 编译器您可以使用key
来索引object
。
【讨论】:
以上是关于如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?的主要内容,如果未能解决你的问题,请参考以下文章