【问题标题】:Override TypeScript interface with multiple generics使用多个泛型覆盖 TypeScript 接口
【发布时间】:2022-01-19 06:13:53
【问题描述】:

我有以下场景:

interface Foo<GenericA, GenericB> {}

我想声明一个Foo类型的变量,但只指定第二个泛型,例如:

const foo: Foo<GenericBType>;

只有在我写的时候才能做到这一点

const foo: Foo<unknown, GenericBType>;

其实也没有那么糟糕,但是感觉也不太对,因为我只想用第二种,第一种完全没兴趣。

有没有其他方法可以更简洁地写这个?

PS:这是关于 expressjs 类型的。我想键入 Request 对象,但我只想考虑 Query 参数的类型,它是 Request 类型中的第四个泛型:

 interface Request<
    P = core.ParamsDictionary,
    ResBody = any,
    ReqBody = any,
    ReqQuery = core.Query,
    Locals extends Record<string, any> = Record<string, any>
> extends core.Request<P, ResBody, ReqBody, ReqQuery, Locals> {}

所以我不得不写这样的东西:

req: Request<unknown, unknown, unknown, Foo>

而且真的不好看……

【问题讨论】:

  • 您可以为Foo 创建一个别名。见this example
  • @captain-yossarian 感谢您的建议,但这仍然意味着我必须将类型替换为未知
  • 您可以使用一些默认值将第一个参数设为可选。 type Foo&lt;A=unknown, B=unknown&gt; 但您需要将第二个参数设为可选。这些是此逻辑的一般规则。
  • 如果所有泛型都是可选的,那么如果您只提供一个泛型参数,TS 编译器会将其视为第一个泛型。没有像_* 这样的通配符。我认为使用unknown 是处理缺失泛型的最佳方法
  • @captain-yossarian 你能把这个作为答案让我接受吗?

标签: typescript express typescript-typings typescript-generics


【解决方案1】:

这里最简单的解决方案是创建类型别名:

interface Foo<GenericA, GenericB> { }

type Foo2<B> = Foo<unknown, B>

declare const foo: Foo2<'generic B'>

如果所有泛型都是可选的,那么如果您只提供一个泛型参数,TS 编译器会将其视为第一个泛型。没有像_* 这样的通配符。我认为使用unknown 是处理缺失泛型的最佳方式。

您可能正在寻找existential types (issues/10571)。打字稿不支持此功能。 Flow 支持存在类型功能,但您可能已经注意到,由于不安全,它现在已被弃用:

当你使用*(existential)类型时触发,因为这种类型是不安全的并且通常与any等价。 *的效果一般可以通过简单的不提供类型注解来实现。

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2014-05-23
    • 1970-01-01
    • 2021-09-16
    • 2018-04-09
    • 1970-01-01
    • 2013-03-19
    • 2017-02-16
    • 2021-10-29
    相关资源
    最近更新 更多