你可以写
combineModels
函数类型如下:
declare function combineModels<T extends ModelOf<any, any>[]>(
...models: T
): T extends ModelOf<infer I, infer U>[]
? ModelOf<UnionToIntersection<I>, U>
: never;
type UnionToIntersection<T> = (T extends any
? (arg: T) => void
: never) extends (arg: infer I) => void
? I
: never;
generic rest parameters
的元组类型
models
函数参数。的所有实例化
T
A
ModelOf<T, A extends string>
是吗
conditionally inferred
作为联合类型
I
和
U
我
T
s) 到交叉点类型。
interface ModelOf<T, A extends string> {}
declare const modelA: ModelOf<{ a: number }, "fooAction">;
declare const modelB: ModelOf<{ b: string }, "barAction">;
const model = combineModels(modelA, modelB);
// ModelOf<{a: number} & {b: string}, "fooAction" | "barAction">
Playground
希望,这有帮助!
你也可以用
lookup type
相反(也许更简单一点):
declare function combineModels<T extends ModelOf<any, any>[]>(
...models: T
): ModelOf<UnionToIntersection<T[number]["t"]>, T[number]["a"]>
Playground