【问题标题】:how to handle Typescript error Object.ts (7053) in newer version of typescript?如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?
【发布时间】: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 = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)$/; ///^\d{4}-\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);
            }
        }
    }

【问题讨论】:

    标签: angular typescript


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 2015-11-06
        • 2022-01-21
        • 2019-06-21
        • 2018-06-05
        • 1970-01-01
        相关资源
        最近更新 更多