[英]Merge your types with existing, Typescript
我有一个接口(如下),我要实现的是更改属性req
,将其添加到我的自定义类型中,本身是req: { session: { userId?: string } }
,是否可以合并我的类型和库Request
类型?
interface MyContext {
req: Request;
res: Response;
}
当两个接口共享相同的名称时,后续属性声明必须具有相同的类型。 这意味着使用声明合并 添加另一个属性很容易,但是覆盖它并不容易。
当是十字路口时
如果只想向Request
添加另一个属性,则可以使用声明合并。
declare global {
interface Request {
session: {
userId?: string
}
}
}
如果是工会
为了覆盖第三方库提供的定义,您需要为其创建自己的版本并将其包含在项目中。 有一个缺点-它们不会合并在一起。 您需要重新创建(或复制粘贴)您关心的my-module
提供的每个类型定义。
my-module.d.ts
declare module 'my-module' {
interface MyContext {
req: Request | { session: { userId?: string } };
res: Response;
}
}
但是,您实际上需要覆盖第三方类型定义的事实几乎总是表明以下两种情况之一:
您可以使用extends
:
interface MyContext extends Request {
//what ever props you want to add
}
现在, MyContext
具有分配给Request
类型的所有属性,以及您定义的任何属性。
如果由于某种原因您只需要Request
类型的特定部分,或者不想使用接口,建议您检查一下utility-types
库,特别是它提供的Assign
, Pick
和Omit
类型。
你可以说:
type MyType = { ...whatever props you need to add}
type MyRequest = Assign<Request, MyType>
现在MyRequest
具有您要添加的道具。
您还可以从Request
选择类型,或从Request
删除类型。 假设Request
具有您要删除的foo
属性:
type MyRequest = Omit<Request, 'foo'>
或者也许您只想要一个假想的道具,叫做bar
:
type JustBarFromRequest = Pick<Request, 'bar'>
然后您可以根据需要Assign
这些新类型。
如果只需要在现有接口上构建,则一定要坚持使用extends
。 如果您需要更改和组成道具和类型,那么我强烈建议阅读有关utility-types
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.