猿问

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

比方说,我有这个:


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!

我想从键和值数组创建一个对象类型。我该怎么做 ?


陪伴而非守候
浏览 153回答 2
2回答

ibeautiful

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  : nevertype 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!

隔江千里

你在这里有两个问题:Objecttype 不是你想要的。Object在 TS 中代表任何非原始类型,并且它不是通用的。普通 JS 对象与对象属于不同的类型Map,尽管它们都继承自 Object 原型。解决方案:// Define correct type for your objecttype MyObject = {  'name': string;  'age': number;}const obj: MyObject  = {  name: "foo",  age: 20}// Create Map from objectconst map = new Map(Object.entries(obj));现在map自动推断为Map<string, string | number>
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答