提问者:小点点

如何重写外部TypeScript接口


我在一个打字稿项目中使用passport。passport的DefinitelyTyped类型定义覆盖了包含< code>user属性的Express请求。但是它将用户定义为一个空界面:

索引.d.ts

declare global {
    namespace Express {
        ...
        // tslint:disable-next-line:no-empty-interface
        interface User {}

        interface Request {
            ...
            user?: User;
            ...
        }
    }
}

然而,在我的整个应用程序中,我希望req.user是这种类型的接口:

interface User {
    id: number
    username: string,
    profilePicture: string,
    name: string
}

我厌倦了在整个应用程序中编写req.user作为user|null。我可以直接重写定义文件中的接口定义,但这似乎是不好的做法,修改<code>node_modules</code>中的文件,如果我更新类型模块,该文件可能会被覆盖。

有没有办法在我的 src 文件夹中编写覆盖 Express.User 的定义文件?我尝试将定义文件复制并修改到我的 src 目录,但它说

全局范围的增强只能直接嵌套在外部模块或环境模块声明中

如果没有声明全局tsc仍然将req.user视为空接口。

我必须在tsconfig.json中包含什么配置才能拾取此覆盖?


共1个答案

匿名用户

合并同一范围内的接口声明。也就是说,以下

interface A {
  name: string;
}

interface A {
  id: number;
}

声明一个接口,即< code>A,具有两个属性< code>name和< code>id。

因此,只需使用护照使用的相同技术来调整类型

// ensure file is parsed as a module
export {}

declare global {
  namespace Express {
    interface User {
      id: number,
      username: string,
      profilePicture: string,
      name: string
    }
  }
}