打字稿:合并两种类型/接口并保持所有泛型有效
Posted
技术标签:
【中文标题】打字稿:合并两种类型/接口并保持所有泛型有效【英文标题】:Typescript: Merge two types/interfaces and keep all generics valid 【发布时间】:2020-08-08 01:14:53 【问题描述】:我想合并两种类型并保持泛型有效。 例如
类型 1
interface Request<P extends core.Params = core.ParamsDictionary, ResBody = any, ReqBody = any, ReqQuery = core.Query> extends core.Request<P, ResBody, ReqBody, ReqQuery>
类型 2
type Auth =
user: User
我希望我的新类型是这两者的合并,该类型可以接收所有这些泛型。
现在我只是合并它们,但我无法使用 Request
类型的泛型。
目前我只是合并这两个。
export type Merge<FirstType, SecondType> = Omit<FirstType, keyof SecondType> & SecondType;
当然我可以手动完成所有这些,但是这种情况在我的项目中重复出现,我想要一个可以为我完成这些的实用方法。 例如
MergeWithGenerics<Request, Body>
新类型保留第一个参数的所有泛型。
我不知道这是否可能,但如果有人可以帮助我,那就太好了。
【问题讨论】:
这里的目标是不必为您的泛型重复默认类型? 对不起,很确定这在 TS 中是不可能的。你能做的最好的事情` type MergedGen = Merge
您不能将泛型类型(不带参数)传递给另一个泛型类型。
interface Generic<P>
type Id<T> = T
type G = Id<Generic>; // Generic type 'Generic<P>' requires 1 type argument(s).(2314)
话虽如此,您对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>
【讨论】:
【参考方案2】:也许您可以使用 sn-p - 假设您使用的是 VSCode 或类似代码。
使用以下 VSCode sn-p,您可以输入“mgen”并完成制表符 (ctrl
+space
),然后在 sn-p 名称上输入tab
。每次按下tab
时,光标都会迭代到下一个变量位置。
sn-ps.json
"Merged Generic":
"prefix": "mgen",
"body": [
"export type Merge<$1, $2> = Omit<$1, keyof $2> & $2;",
],
"description": "shorthand for defining merged generics"
在您的情况下,您可能需要 3 或 4 个变量。
【讨论】:
以上是关于打字稿:合并两种类型/接口并保持所有泛型有效的主要内容,如果未能解决你的问题,请参考以下文章