interface IObj {
    value:string;
    value2:string;
    value3:number;
}
let obj={
    value:"JS",
    value2:"www.google.com",
    value3:2018
}
type kM = "name"|"website"|"year";
const keyMap :{[key in kM]:keyof IObj}= {
    name:"value",
    website:"value2",
    year:"value3"
}
const year:number  = obj[keyMap["year"]]; // ERROR: Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'.
obj[keyMap["name"]] = "Javascript";  // ERROR: Type 'string' is not assignable to type 'never'.

我try 自定义映射或访问对象中的键,但遇到错误. 应该采取哪些步骤来解决上述错误?

推荐答案

在继续之前,请查看@jcalz的 comments :

  • kMkey是非传统的名字.建议使用KM将其与值区分开来,使用K将其表示为type 参数.

下面的代码片段修复了TypeScript个错误:

interface IObj {
    value: string;
    value2: string;
    value3: number;
}

let obj = {
    value: "JS",
    value2: "www.google.com",
    value3: 2018
}

type KM = "name" | "website" | "year";

const keyMap = {
    name: "value",
    website: "value2",
    year: "value3"
} as const;

const year: number = obj[keyMap["year"]];
obj[keyMap["name"]] = "JavaScript";

Playground link

TypScript编译器很难确定该行的返回类型

{[key in KM]: keyof IObj}

当将对象定义为const时,它会将对象解释为文本.

现在您甚至可以从此处删除type注释

const year = obj[keyMap["year"]];

因为TypScript现在可以正确地从对象推断类型.

Typescript相关问答推荐

React Router SR:useLocate()只能在路由组件的上下文中使用

排序更改数组类型

在Angular中,如何在文件上传后清除文件上传文本框

类型脚本`Return;`vs`Return unfined;`

如何使用泛型自动推断TS中的类型

Next.js错误:不变:页面未生成

TypeScrip表示该类型不可赋值

了解类型规则中的关键字

在对象中将缺省值设置为空值

Angular 15使用react 式表单在数组内部创建动态表单数组

在打印脚本中使用泛型扩展抽象类

找不到财产的标准方式?

TypeScrip错误:为循环中的对象属性赋值

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

Typescript .根据枚举输入参数返回不同的对象类型

如何在Nextjs路由处理程序中指定响应正文的类型

字幕子集一个元组的多个元素

使用RXJS获取数据的3种不同REST API

Typescript不允许在数组中使用联合类型