假設我有一個帶有一組靜態鍵的物件,然后是一個將這些鍵的子集指定為靜態陣列的型別:
const myBigStaticObject = {
key1: () => 'foo',
key2: () => 'bar',
// ...
keyN: () => 'fooN',
}
type BigObject = typeof myBigStaticObject
type Keys = ['key2', 'keyN']
是否有一種很好的方法可以以編程方式創建一個映射型別,該型別Keys作為其通用引數,即執行以下操作:
type ObjectValueFromKeys<K extends (keyof BigObject)[]> = // ???
// such that:
ObjectValueFromKeys<Keys> = [() => 'bar', () => 'fooN']
這里物件的等價物是:
const objectKeys = {
a1: 'key2';
a2: 'keyN';
}
type ObjectValueFromObjectKeys<M extends Record<string, keyof BigObject>> = {
[K in keyof M]: BigObject[M[K]]
}
// then
type ObjectValueFromObjectKeys<typeof objectKeys> = {
a1: () => 'bar';
a2: () => 'fooN';
}
uj5u.com熱心網友回復:
您可能不知道這一點,但您實際上可以使用帶有陣列和元組的映射型別,同時仍然在輸出中保留陣列/元組型別!
這意味著你可以使用這樣的東西,它首先檢查值是否是大物件的鍵:
type ObjectValueFromKeys<K extends (keyof BigObject)[]> = {
[P in keyof K]: K[P] extends keyof BigObject ? BigObject[K[P]] : K[P];
};
它就像一個魅力:
type T1 = ObjectValueFromKeys<["key2", "keyN"]>;
// ^? [() => "bar", () => "fooN"]
不相信我?你自己看。
你可能會注意到as const在大物件中使用了:
key1: () => 'foo' as const,
這是因為,出于某種原因,TypeScript 無法推斷出這個函式只能回傳"foo"。所以我習慣于as const讓它回傳"foo"我們案例的文字,這樣我們就可以看到解決方案是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473533.html
