首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射类型,将给定类型的变体结合在一起?

问映射类型,将给定类型的变体结合在一起?
EN

Stack Overflow用户
提问于 2021-12-14 13:58:00
回答 1查看 90关注 0票数 1

给定一种包含所有可能性的类型(例如,无标记的联合):

代码语言:javascript
复制
type Input = {
  a: string,
  b: number,
  c: boolean,
};

我想用这种API映射它:

代码语言:javascript
复制
type MapItSomehow<T> = ???;

type Output = MapItSomehow<Input>;

最终得到这个:

代码语言:javascript
复制
type Output = {
  a: string,
  b: undefined,
  c: undefined,
} | {
  a: undefined,
  b: number,
  c: undefined,
} | {
  a: undefined,
  b: undefined,
  c: boolean,
};

证明这是可行的,如果我能做到:

代码语言:javascript
复制
let r: Result = ([] as Result[])[0];

if ('a' in r) {
  r.a.trim() // not r.a!.trim()
}
else if // same for each field ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 14:05:24

使用映射类型、Record和Exclude是可能的

代码语言:javascript
复制
type Input = {
  a: string,
  b: number,
  c: boolean,
};

type Values<T> = T[keyof T]

type Mapped<T> = Values<{
  [Prop in keyof T]: Record<Prop, T[Prop]>
}>


type Result = Mapped<Input>

declare let x: Result

if ('a' in x) {
  x.a.trim()
}

游乐场

Mapped -遍历每个属性并创建预期联合类型的新部分,其中设置当前键,而其他键Exclude<keyof T, Prop>是undefined。

Values -获得所有对象值的联合类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70350122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档