【问题标题】:TypeScript: tuple type to object typeTypeScript:元组类型到对象类型
【发布时间】:2023-04-01 05:35:01
【问题描述】:

考虑这样的元组:

type MyTuple = [A, B];

其中AB 都有一个名为key 的属性。例如,

interface A = {
  key: 'sandwiches'
}

interface B = {
  key: 'pasta'
}

我想要以下界面:

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

有没有办法动态地做到这一点?

我在想,如果这是可以实现的,它可能看起来像:

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

但这不起作用。

这个问题是Typescript: object type to array type (tuple)

【问题讨论】:

  • 我认为打字稿只在编译时可用——你的意思是“有没有办法动态地做到这一点?”您只是想在编译时推断出 Result 接口,还是在寻找运行时解决方案?
  • 编译时间 :) 下面的答案显示了解决方案。

标签: typescript typescript-typings


【解决方案1】:

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

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>

【讨论】:

  • 谢谢,这正在工作!我会在几分钟内接受这个作为答案,一旦我能够接受。
  • 非常好!顺便说一句[K in T[number]['key']]: K 这将与Extract&lt;T[number], { key : K}&gt; 一样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多