本文介绍了如何覆盖外部打印脚本接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个打字项目中使用passportThe DefinitelyTyped type definition for passport重写Express请求以包括user属性。但它将用户定义为空界面:

index.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 as User | null。我可以直接覆盖定义文件中的接口定义,但这似乎不适合在node_modules中修改文件,如果我更新类型模块,该文件可能会被覆盖。

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

Augmentations for the global scope can only be directly nested in external modules or ambient module declarations

如果没有declare global,TSC仍将req.user视为空接口。

我必须在tsconfig.json中包含什么配置才能选择此替代?

推荐答案

合并同一作用域中的接口声明。也就是说,以下

interface A {
  name: string;
}

interface A {
  id: number;
}

声明单个接口A,有两个属性nameid

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

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

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

这篇关于如何覆盖外部打印脚本接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 23:13