是否可以使用映射类型更改属性形状?

时间:2017-11-04 14:17:33

标签: typescript mapped-types

我有这样的类型

type Foo = {
   x : Bar<A>
   y : Bar<B>
}

type Foo = {
  x: {item:A}
  y: {item:B}
}

我想表达这种类型

{
  x: A
  y: B
}

在伪代码中,它可能看起来像这样

type Flatten<T> = {
    [P in keyof T where T[P] extends {item: X}]: X;
}

是否可以做这样的事情?

1 个答案:

答案 0 :(得分:1)

可以使用Foo的第二个变体,其中每个成员的类型本身都是一个具有相同名称(item)的成员,因此您可以使用索引访问类型运算符映射类型中的['item']

type A = string;
type B = number;

type Foo = {
  x: {item:A}
  y: {item:B}
}

type M<F extends {[n in string]: { item: {} }}> = {
    [n in keyof F]: F[n]['item']
}

type U = M<Foo>; // type U = { x: string; y: number; }