合并接口声明的类型属性

时间:2019-07-10 09:21:40

标签: typescript typescript-typings type-declaration

我无法在全局范围内扩展第三方库的接口,因为在根级别导入其他文件将导致声明文件不再是全局的。

这是一个例子:

我想在Express的Request对象上添加类型为“ MyUser”的属性“ user”。 如果它是MyUser类型,则可以执行以下操作:

declare namespace Express {
  interface Request {
    user: string;
  }
}

,然后在其他地方:

...
function(..., req: Request, ...) {
  ...
  req.user; //its a string
  ...
}

,一切都会正常运行。但是,执行以下操作无效:

import MyUser from "../../src/types/MyUser";
declare namespace Express {
  interface Request {
    user: MyUser;
  }
}

因为我现在有一个顶级导入。有没有办法避免呢?如果您甚至不能在声明中使用自己的类型,那么能够合并声明又有什么意义呢?

1 个答案:

答案 0 :(得分:1)

如果添加导入,则文件是模块,因此任何定义都是本地的(没有导入,该文件是旧脚本文件,并且其中的所有内容都是全局的)。

要将接口置于全局范围并使用导入,请使用declare global

import MyUser from "../../src/types/MyUser";
declare global {
    namespace Express {
        interface Request {
           user: MyUser;
        }
    }
}