如何在较新版本的打字稿中处理打字稿错误 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)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中定义敲除绑定处理程序?

地图在打字稿中显示错误

如何在打字稿中声明成功/失败返回类型

如何在打字稿中声明全局变量

如何在打字稿中定义一个常量数组

如何在打字稿中使用 rxjs6 分区?