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

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, Auth>;`,但这显然是手动的

请让您的问题更具体,最好使用打字稿游乐场链接 【参考方案1】:

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

interface Generic<P>  
type Id<T> = T
type G = Id<Generic>; // Generic type 'Generic<P>' requires 1 type argument(s).(2314)

话虽如此,您对Merge 的定义似乎是您尝试做的一个很好的简写。 Merge&lt;Request&lt;Params, ResBody, ReqBody, Query&gt; &amp; Auth&gt; 似乎没有RequestWithAuth&lt;Params, ResBody, ReqBody, Query&gt; 大很多。

@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 个变量。

【讨论】:

以上是关于打字稿:合并两种类型/接口并保持所有泛型有效的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:允许泛型类型仅是具有“字符串”属性的对象

打字稿:类型 ConstructorParameters 不接受泛型

打字稿,合并对象类型?

打字稿,更改嵌套在界面中的所有匹配键的类型

打字稿泛型返回类型

打字稿承诺泛型类型