2 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個贊
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貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超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));
現(xiàn)在map自動推斷為Map<string, string | number>
添加回答
舉報(bào)