如何在Typescript中为每种类型键入相交图?

时间:2018-07-04 13:31:33

标签: typescript

我有许多接口,例如FooBarBaz,...,而且我需要在映射始终相同的情况下统一其映射类型(例如,使用{ {1}})。

Pick

我可以“手动”完成该操作:

interface Foo {
  a: 'FooA';
  b: 'FooB';
}

interface Bar {
  a: 'BarA';
  b: 'BarB';
}

interface Baz {
  a: 'BazA';
  b: 'BazB';
}

但我不想重复自己。以下代码不会执行此操作,因为它会合并类型的属性并在之后进行映射:

type A = Pick<Foo, 'a'> | Pick<Bar, 'a'> | Pick<Baz, 'a'>;
type B = Pick<Foo, 'b'> | Pick<Bar, 'b'> | Pick<Baz, 'b'>;

有办法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用条件类型的分布行为:

type PickDistributed<T, K extends keyof T> = T extends object ? Pick<T, K> : never;

type Union = Foo | Bar | Baz;

type A1 = PickDistributed<Union, 'a'>; // creates Pick<Foo, 'a'> | Pick<Bar, 'a'> | Pick<Baz, 'a'>
type B1 = PickDistributed<Union, 'b'>;