繁体   English   中英

将您的类型与现有的Typescript合并

[英]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库,特别是它提供的AssignPickOmit类型。

你可以说:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM