2 回答
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!
TA贡献1906条经验 获得超10个赞
你在这里有两个问题:
Object
type 不是你想要的。Object
在 TS 中代表任何非原始类型,并且它不是通用的。普通 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>
添加回答
举报