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

将您的类型与现有的Typescript合并,typescript,Typescript,我在下面有一个接口,我想实现的是更改属性req,将我的自定义类型添加到其中,本身就是req:{session:{userId?:string}},是否可以合并我的类型和库请求类型 您可以使用扩展: 现在,MyContext拥有分配给请求类型的所有属性,以及您定义的任何属性 如果出于某种原因,您只需要请求类型的特定部分,或者不想使用接口,我建议您查看实用程序类型库,特别是它提供的赋值、拾取和省略类型 你可以说: type MyType = { ...whatever props you need

我在下面有一个接口,我想实现的是更改属性req,将我的自定义类型添加到其中,本身就是req:{session:{userId?:string}},是否可以合并我的类型和库请求类型

您可以使用扩展:

现在,MyContext拥有分配给请求类型的所有属性,以及您定义的任何属性

如果出于某种原因,您只需要请求类型的特定部分,或者不想使用接口,我建议您查看实用程序类型库,特别是它提供的赋值、拾取和省略类型

你可以说:

type MyType = { ...whatever props you need to add}
type MyRequest = Assign<Request, MyType>
或者,你可能只想要一个虚构的道具,叫做bar:

您可以根据需要分配这些新类型

如果您只需要在现有接口上构建,那么一定要坚持使用extends。如果您需要修改和撰写道具和类型,那么我强烈建议您阅读关于您可以使用扩展的

现在,MyContext拥有分配给请求类型的所有属性,以及您定义的任何属性

如果出于某种原因,您只需要请求类型的特定部分,或者不想使用接口,我建议您查看实用程序类型库,特别是它提供的赋值、拾取和省略类型

你可以说:

type MyType = { ...whatever props you need to add}
type MyRequest = Assign<Request, MyType>
或者,你可能只想要一个虚构的道具,叫做bar:

您可以根据需要分配这些新类型


如果您只需要在现有接口上构建,那么一定要坚持使用extends。如果您需要更改和编写道具和类型,那么我强烈建议您阅读有关

的内容。当两个接口共享相同的名称时,后续的属性声明必须具有相同的类型。这意味着使用添加另一个属性很容易,但覆盖它并不容易

当它是一个十字路口

如果只想向请求添加另一个属性,可以使用声明合并

declare global {
    interface Request {
        session: {
            userId?: string
        }
    }
}
当它是一个联盟

为了覆盖第三方库提供的定义,您需要为它们创建自己的版本,并将其包含在项目中。有一个缺点——它们不会合并在一起。您需要重新创建或复制粘贴您关心的my module提供的每个类型定义

my-d.ts模块

但是,您需要覆盖第三方类型定义的事实几乎总是表明以下两点之一:

您没有按照预期的方式使用库,或者 类型定义不正确,应在上游修复。
当两个接口共享相同的名称时,后续属性声明必须具有相同的类型。这意味着使用添加另一个属性很容易,但覆盖它并不容易

当它是一个十字路口

如果只想向请求添加另一个属性,可以使用声明合并

declare global {
    interface Request {
        session: {
            userId?: string
        }
    }
}
当它是一个联盟

为了覆盖第三方库提供的定义,您需要为它们创建自己的版本,并将其包含在项目中。有一个缺点——它们不会合并在一起。您需要重新创建或复制粘贴您关心的my module提供的每个类型定义

my-d.ts模块

但是,您需要覆盖第三方类型定义的事实几乎总是表明以下两点之一:

您没有按照预期的方式使用库,或者 类型定义不正确,应在上游修复。
在这种情况下,您可以扩充内置的请求类型。我将更新我的答案。在这种情况下,您可以增加内置的请求类型。我会更新我的答案。
type JustBarFromRequest = Pick<Request, 'bar'>
declare global {
    interface Request {
        session: {
            userId?: string
        }
    }
}
declare module 'my-module' {
  interface MyContext {
    req: Request | { session: { userId?: string } };
    res: Response;
  }
}