用多个泛型覆盖 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.
我有以下场景:
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.