【发布时间】: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<A=unknown, B=unknown>但您需要将第二个参数设为可选。这些是此逻辑的一般规则。 -
如果所有泛型都是可选的,那么如果您只提供一个泛型参数,TS 编译器会将其视为第一个泛型。没有像
_或*这样的通配符。我认为使用unknown是处理缺失泛型的最佳方法 -
@captain-yossarian 你能把这个作为答案让我接受吗?
标签: typescript express typescript-typings typescript-generics