打字稿:合并两种类型/接口并保持所有泛型有效

Sar*_*hah 6 typescript typescript-generics

我想合并两种类型并保持泛型有效。例如

类型 1

interface Request<P extends core.Params = core.ParamsDictionary, ResBody = any, ReqBody = any, ReqQuery = core.Query> extends core.Request<P, ResBody, ReqBody, ReqQuery> { }
Run Code Online (Sandbox Code Playgroud)

类型 2

type Auth = {
  user: User
}
Run Code Online (Sandbox Code Playgroud)

我希望我的新类型是这两者的合并,其中类型可以接收所有这些泛型。

现在我只是合并它们,但后来我无法使用该Request类型的泛型。

目前我只是合并这两个。

export type Merge<FirstType, SecondType> = Omit<FirstType, keyof SecondType> & SecondType;
Run Code Online (Sandbox Code Playgroud)

当然我可以手动完成所有这些,但是这种情况在我的项目中重复出现,我想要一个可以为我完成此操作的实用方法。例如

MergeWithGenerics<Request, Body>
Run Code Online (Sandbox Code Playgroud)

新类型保留第一个 arg 的所有泛型。

我不知道它是否可能,但如果有人能帮我解决这个问题,那就太好了。

art*_*pse 1

您不能将泛型类型(不带参数)传递给另一个泛型类型。

interface Generic<P> { }
type Id<T> = T
type G = Id<Generic>; // Generic type 'Generic<P>' requires 1 type argument(s).(2314)
Run Code Online (Sandbox Code Playgroud)

话虽如此,您的定义Merge似乎是您想要做的事情的一个很好的速记。Merge<Request<Params, ResBody, ReqBody, Query> & Auth>那么看起来并没有大很多RequestWithAuth<Params, ResBody, ReqBody, Query>

@leonardfactory 提案的一个变体也可能会简化一些:

 type ExtendedRequest<Extension, P, TRes, TReq, TQuery> = Merge<Request<P, TRes, TReq, TQuery>, Extension>
Run Code Online (Sandbox Code Playgroud)