用多个泛型覆盖 TypeScript 接口

Override TypeScript interface with multiple generics

我有以下场景:

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>

而且真的不美...

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

interface Foo<GenericA, GenericB> { }

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

declare const foo: Foo2<'generic B'>

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

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

Triggers when you use the * (existential) type, as this type is unsafe and usually just equivalent to any. The effect of * can generally be achieved by simply not providing a type annotation.