如何覆盖外部 TypeScript 接口

Posted

技术标签:

【中文标题】如何覆盖外部 TypeScript 接口【英文标题】:How to override external TypeScript interface 【发布时间】:2020-03-06 08:21:11 【问题描述】:

我在 TypeScript 项目中使用 passport。 The 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 中包含什么配置才能获取此覆盖?

【问题讨论】:

这能回答你的问题吗? Extend Express Request object using Typescript 【参考方案1】:

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

interface A 
  name: string;


interface A 
  id: number;

声明一个接口,即A,具有两个属性,nameid

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

// ensure file is parsed as a module
export 

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

【讨论】:

以上是关于如何覆盖外部 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:覆盖和修复包的类型定义

如何覆盖这个 ESLint TypeScript 规则?

如何在 Typescript 接口中存储 objectID 属性?

在 TypeScript 接口中覆盖/覆盖方法签名

用 Jest 测试 Typescript 接口

Typescript 类继承:覆盖 ko.computed 方法