首页 > 解决方案 > TypeScript: tuple type to object type

问题描述

Consider a tuple like this:

type MyTuple = [A, B];

where A and B both have an attribute named key. For instance,

interface A = {
  key: 'sandwiches'
}

interface B = {
  key: 'pasta'
}

I desire the following interface:

interface Result {
  sandwiches: A;
  pasta: B;
}

Is there a way to do this dynamically?

I'm thinking that, if this is achievable, it might look something like:

type MapTuple<T> = {
  [K in keyof T]: T[K]["key"]
}

but this doesn't work.

This question is the inverse of Typescript: object type to array type (tuple)

标签: typescripttypescript-typings

解决方案


这将产生预期的效果。您需要映射元组的所有键属性并为每个键提取元组成员:

type MyTuple = [A, B];

interface A {
  key: 'sandwiches'
}

interface B {
  key: 'pasta'
}


type MapTuple<T extends Array<{ key: string }>> = {
  [K in T[number]['key']]: Extract<T[number], { key : K}>
}

type R = MapTuple<MyTuple>

推荐阅读