使用多个泛型覆盖 TypeScript 接口

3

我有以下情况:

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>

这真的不太好看...


2
你可以为 Foo 创建一个别名。请参考此示例 - captain-yossarian from Ukraine
@captain-yossarian 感谢您的建议,但这仍意味着我必须用未知类型替换一个类型。 - Alexandru Pirvu
你可以通过设置默认值来使第一个参数变为可选。type Foo<A=unknown, B=unknown> 但是这样你需要将第二个参数也变为可选。这些是此逻辑的一般规则。 - captain-yossarian from Ukraine
1
如果所有泛型都是可选的,那么如果您只提供一个泛型参数,TS编译器将把它视为第一个泛型。没有通配符像 _*。我认为使用 unknown 是处理缺少泛型的最佳方式。 - captain-yossarian from Ukraine
1
@captain-yossarian,你能把这个作为答案发出来,这样我就可以接受它了吗? - Alexandru Pirvu
显示剩余4条评论
1个回答

0

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

interface Foo<GenericA, GenericB> { }

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

declare const foo: Foo2<'generic B'>

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

你可能正在寻找存在类型(issues/10571)。这在typescript中不受支持。 存在类型特性在Flow中得到了支持,但正如你可能已经注意到的那样,由于不安全性,它现在已被弃用:

当您使用*(存在)类型时触发此操作,因为此类型是不安全的,并且通常仅等效于任何类型。*的效果通常可以通过简单地不提供类型注释来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接