如何基于接口定义数组类型(数组中的每个元素可以具有基于接口中特定键/值对的类型)?

时间:2020-05-20 17:15:34

标签: typescript

给出以下类型

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。我正试图朝相反的方向前进。

0 个答案:

没有答案