为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法将 Map<K,V> 类型转换为 Object 类型?

有没有办法将 Map<K,V> 类型转换为 Object 类型?

陪伴而非守候 2023-03-18 14:57:51
比方说,我有这个:const keys = ["name","age"] as const;type values = [string, number];const obj : Object<keys,values> = {    name : "foo", age : 20} // as Map<keys,values> valid !const obj2 : Object<keys,values> = {    name : "foo"} // as Map<keys,values> error, age is missing!const obj3 : Object<keys,values> = {    name : "foo", age : null} // as Map<keys,values> error, age is not a number!我想从键和值数组创建一个对象类型。我该怎么做 ?
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

type keys = ['name', 'age']

type values = [string, number]


type ZipTuple<T extends readonly any[], U extends readonly any[]> = {

  [K in keyof T]: [T[K], K extends keyof U ? U[K] : never]

}


type KeyValTuplesToObject<K extends readonly PropertyKey[], V extends readonly any[]> = ZipTuple<

  K,

  V

>[number] extends infer Z

  ? [Z] extends [[any, any]]

    ? { [P in Z[0]]: Extract<Z, [P, any]>[1] }

    : never

  : never


type Obj = KeyValTuplesToObject<keys, values>


const obj: Obj = {

  name: 'foo',

  age: 20

} // as Map<keys,values> valid !


const obj2: Obj = {

  name: 'foo'

} // as Map<keys,values> error, age is missing!


const obj3: Obj = {

  name: 'foo',

  age: null

} // as Map<keys,values> error, age is not a number!


查看完整回答
反对 回复 2023-03-18
?
隔江千里

TA贡献1906条经验 获得超10个赞

你在这里有两个问题:

  1. Objecttype 不是你想要的。Object在 TS 中代表任何非原始类型,并且它不是通用的。

  2. 普通 JS 对象与对象属于不同的类型Map,尽管它们都继承自 Object 原型。

解决方案:

// Define correct type for your object

type MyObject = {

  'name': string;

  'age': number;

}


const obj: MyObject  = {

  name: "foo",

  age: 20

}


// Create Map from object

const map = new Map(Object.entries(obj));


现在map自动推断为Map<string, string | number>


查看完整回答
反对 回复 2023-03-18
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信