首页 > 其他分享 >解决 TS7053: Element implicitly has an any type because expression of type string can't be used t

解决 TS7053: Element implicitly has an any type because expression of type string can't be used t

时间:2024-03-27 23:55:33浏览次数:28  
标签:index because const string controlKey key 类型 type

背景

有个接口

interface DataType {
    id: number;
    name: string;
    created_at: string;
    updated_at: string;
}

我的数据

{
    "id": 9,
    "created_at": "2024-03-11T17:50:16.129235+08:00",
    "updated_at": "2024-03-11T17:50:16.129293+08:00",
    "name": "qqqqqqqqqq1",
}

现在有个需求

需要把数据转换成

转换成这样

[
    {
        "span": 3,
        "key": "id",
        "label": "ID",
        "children": 9
    },
    {
        "span": 3,
        "key": "created_at",
        "label": "创建时间",
        "children": "2024-03-11T17:50:16.129235+08:00"
    },
    {
        "span": 3,
        "key": "updated_at",
        "label": "更新时间",
        "children": "2024-03-11T17:50:16.129293+08:00"
    },
    {
        "span": 3,
        "key": "name",
        "label": "名称",
        "children": "qqqqqqqqqq1"
    }
]

转换部分

const controlKey = {
    id: "ID",
    name: "名称",
    created_at: "创建时间",
    updated_at: "更新时间",
};
const items: DescriptionsProps["items"] = [];
for (const key in record) {
    const value: string = key.trim();
    const name = controlKey[value];
    items.push({
        span: 3,
        key: key,
        label: name,
        children: record[key],
    });
}

我以上面的方式来转换的,结果也确实转换成功了

但是,IDE工具会报错

const name = controlKey[value];

TS7053: Element implicitly has an any type because expression of type string can't be used to index type
{     
      id: string;     
      name: string;     
      created_at: string;
      updated_at: string; 
}
No index signature with a parameter of type string was found on type
{     
      id: string;     
      name: string;     
      created_at: string;     
      updated_at: string; 
}

children: record[key],

TS7053: Element implicitly has an any type because expression of type string can't be used to index type DataType
No index signature with a parameter of type string was found on type DataType

翻译下

元素隐式具有any类型,因为字符串类型的表达式不能用于索引类型DataType

意思就是说 controlKey 的类型定义与 record 的类型定义不匹配

controlKey 中的每个属性的值都是字符串类型,而 record 中的属性名可能是字符串类型也可能是数字类型,因此在使用 controlKey[value] 时 TypeScript 报错。

因为ts比较严格,所以这里就无法用 record 的key作为 controlKey 的key来索引

解决办法

给临时变量对象添加索引签名

const controlKey: { [key: string]: string } = {
    id: "ID",
    name: "名称",
    created_at: "创建时间",
    updated_at: "更新时间",
};

添加了索引签名 { [key: string]: string };,

允许使用字符串类型的键来访问 controlKey 对象的属性。

这样,就可以在 for-in 循环中使用 record 对象的属性名作为键来访问 controlKey 对象的对应属性值了。

使用明确推断的方式

const controlKey: Record<keyof DataType, string> = {
    id: "ID",
    name: "名称",
    description: "描述",
    url: "仓库URL",
    created_at: "创建时间",
    updated_at: "更新时间",
};
const items: DescriptionsProps["items"] = [];
for (const key in record) {
    const value: string = key.trim();
    const name = controlKey[value as keyof DataType];
    items.push({
        span: 3,
        key: key,
        label: name,
        children: record[key as keyof DataType],
    });
}

在这个解决方案中,我们使用 Record<keyof DataType, string> 来定义 controlKey

它确保了 controlKey 中的键是 DataType 中属性名的有效集合,并且值的类型为字符串。

然后在使用 controlKey 时,我们可以直接使用属性名作为索引键,并通过 as keyof DataType 来告诉 TypeScript,key 是 DataType 的有效属性名。

补充

泛型类型Record

这里简单介绍下泛型类型Record

该类型的源码

type Record<K extends keyof any, T> = {
    [P in K]: T;
};

它接收两个泛型参数:K和T。 K是一个可以 keyof any 的类型,代表键名的类型;T代表值的类型。

Record类型是一个对象类型,它的键是K类型,值是T类型。这个类型的对象的所有属性的值类型都是T。

例如

type Person = Record<string, number>;
const person: Person = {
    name: "aaa", // 错误,值类型不匹配
    age: 20
};

type Options = Record<"timeout" | "onComplete", number>;
const options: Options = {
    timeout: 1000,
    onComplete: 200
};

在上面的例子中,Person类型表示一个对象,其中任意属性的值都必须是number类型。

而Options类型表示一个对象,其中timeout和onComplete属性的值都必须是number类型。


而在咱们的代码中

Record<keyof DataType, string> 是用于创建一个新的对象类型,其中对象的键是来自另一个类型的属性名集合,而值都是指定的类型。

具体来说:

  • keyof DataType 表示取 DataType 类型的所有属性名构成的联合类型。
  • string 表示这个对象的值类型为字符串。

标签:index,because,const,string,controlKey,key,类型,type
From: https://www.cnblogs.com/guangdelw/p/18100600

相关文章

  • 鸿蒙开发 TypeScript 基础语法
    文章的最下面有官网链接可以进行练习!变量声明TypeScript在JavaScript的基础上加入了静态类型检查功能,因此每一个变量都有固定的数据类型let:声明变量的关键字,const则代表常量示例代码://string:字符串,可以用单引号或双引号letmsg:string='helloworld'//number:数......
  • 实例、构造函数、原型、原型对象、prototype、__proto__、原型链……
    学习原型链和原型对象,不需要说太多话,只需要给你看看几张图,你自然就懂了。prototype表示原型对象__proto__表示原型实例、构造函数和原型对象以error举例图中的error表示axios抛出的一个错误对象(实例)。宇宙的尽头是nullObject.prototype.__proto__===null......
  • npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3
    在使用npm时,有时候您可能会遇到类似以下错误的权限问题:npmERR!path/Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3npmERR!codeEACCESnpmERR!errno-13npmERR!syscallopennpmERR!Error:EACCES:permissiondenied,open'/Users/apple/......
  • FreeType Glyph Conventions 翻译(3) ——Glyph Metrics 字符图形参数
    原文地址https://freetype.org/freetype2/docs/glyphs/glyphs-3.html目录基线,笔位置以及布局Baseline,pensandlayouts排版参数和包围盒Typographicmetricsandboundingboxes定位和步进BearingsandAdvances网格对齐Theeffectsofgrid-fitting文本宽度和包围盒Text......
  • 鸿蒙TypeScript入门学习第一天【简单介绍】
    1.TypeScript教程TypeScript是JavaScript的一个超集,支持ECMAScript6标准()。TypeScript由微软开发的自由和开源的编程语言。TypeScript设计目标是开发大型应用,它可以编译成纯JavaScript,编译出来的JavaScript可以运行在任何浏览器上。2、语言特性TypeScript是......
  • go判断实现接口的方法 var _ Interface = (*Type)(nil)
    阅读源码过程中发现很多var_Interface=(*Type)(nil)写法,对于接口实现情况的判断十分优雅,而自己编写代码过程中鲜有涉及。var_InnerObjectWithSelector=(*PodChaos)(nil)var_InnerObject=(*PodChaos)(nil)其作用就是用来检测*Type是否实现了Interface接口,有多种形......
  • 【SPIE 出版|EI, Scopus Index】第六届图像、视频处理和人工智能国际会议(IVPAI 2024)
    第六届图像、视频处理和人工智能国际会议(IVPAI2024)日期:2024年7月21-23日地点:马来西亚,吉隆坡官网:www.ivpai.org会议背景:IVPAI在过去的五年(2018-2021&2023)里取得了巨大的成功。累计吸引了超过7000份申请和2000名与会者,展现了其在全球范围内的广泛影响力和学术价值。......
  • 前端学习-TypeScript菜鸟教程-002-TypeScript基础知识
    菜鸟教程链接基本是阅读教程,记笔记大部分为直接复制基础类型any,number,string,boolean,数组(如letx:number[]=[1,2]或letx:Array<number>=[1,2]),元组(letx:[string,number])enumenumColor{Red,Green,Blue};letc:Color=Color.Blue;void:用于标识方......
  • FUSB302BMPX 可编程USB芯片控制器 接口集成电路 302B Type-C Control IC with PD
    FUSB302BMPX是一种可编程的USBType-C控制器,由安森美半导体公司生产。它支撑USBType-C检测,包含衔接和方向,并集成了USBBMC功率输送协议的物理层,可完成高达100W的电源和角色交换。该控制器适用于希望完成DRP/SRC/SNKUSBType-C衔接器的系统规划人员。此外,FUSB302BMPX支撑USB3......
  • TorchV的RAG实践分享(三):解析llama_index的数据存储结构和召回策略过程
    1.前言LlamaIndex是一个基于LLM的数据处理框架,在RAG领域非常流行,简单的几行代码就能实现本地的文件的对话功能,对开发者提供了极致的封装,开箱即用。本文以官方提供的最简单的代理示例为例,分析LlamaIndex在数据解析、向量Embedding、数据存储及召回的整个源码过程。通过学习框架......