【问题标题】:Type properties of merged interface declaration合并接口声明的类型属性
【发布时间】:2019-07-10 17:39:51
【问题描述】:

我在全局扩展第三方库的接口时遇到问题,因为在根级别导入其他文件会导致声明文件不再是全局的。

这是一个例子:

我想在 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;
  }
}

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

【问题讨论】:

    标签: typescript typescript-typings type-declaration


    【解决方案1】:

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

    要将接口放在全局范围内并使用导入,请使用declare global

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

    【讨论】:

    • @Fly wops 忘记删除多余的 declare。固定
    • 啊,我明白了。编译器现在抱怨我的用户声明,“'user' 的所有声明必须具有相同的修饰符。”。不过,我看不出我还会在哪里声明 user 以便我可以有不同的修饰符。知道这是为什么吗?
    • 应该可以,除非user 也在express 版本中定义
    • 啊,护照库也定义了。但是,它应该被定义为“any”(这就是为什么我想在它上面添加我自己的类型)
    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2021-06-07
    • 2023-03-18
    • 2019-12-22
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多