给出以下类型
type MyType<V, I extends string> = {
id: I;
value: V
}
type ExtractIds<T extends { id: string }[]> = T[number]['id'];
type ExtractSpecificType<A, T> = A extends { id: T } ? A : never;
type MyMappedType<A extends MyType<unknown, string>[]> = {
[key in ExtractIds<A>]: ExtractSpecificType<A[number], key>
}
我具有以下值:
const m1: MyType<'value1', 'm1'> = {
id: 'm1',
value: 'value1'
}
const m2: MyType<'value2', 'm2'> = {
id: 'm2',
value: 'value2'
}
const mArr= [m1, m2];
const mMap: MyMappedType<typeof mArr> = {
m1,
m2
}
type ss = ExtractIds<typeof mArr>
type tt = MyMappedType<typeof mArr>
现在,假设我得到了tt
(这是一个具有两个键/值对的对象,其中值的类型为MyType
,而对应的键为id
MyType
值),我想创建一个数组类型,每个元素都是一个对象,其对象类型为tt对象中值之一的{ id: the specific string literal }
。换句话说,我想将一个我们完全知道类型的对象映射到一个数组。
我想要一种像ArrayFromObject<T extends MyMappedType>
这样的类型运算符,我可以将其用作type myArrayType = ArrayFromObject<tt>
,并且我将拥有一个数组,并且每个元素都以特定的方式键入(每个元素的类型为派生自生成对象中的一个特定键/值对。
在TS中可以吗?
我已经看到了如何从数组类型变为对象类型,例如here。我正试图朝相反的方向前进。