我有许多接口,例如Foo
,Bar
,Baz
,...,而且我需要在映射始终相同的情况下统一其映射类型(例如,使用{ {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'>;
有办法吗?
答案 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'>;