Typescript自定义类型定义在导入类上中断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Typescript自定义类型定义在导入类上中断相关的知识,希望对你有一定的参考价值。

我有一个自定义类型定义来扩充现有的接口(Express Request,如here所示)。 express.d.ts的内容:

declare namespace Express {
  export interface Request {
    name: string
  }
}

工作良好。但是,我不需要将name作为字符串,而是需要将它作为自定义类MyClass。类定义如下:

export class MyClass {
  first: string;
  last: string;
}

我将界面扩充更改为:

import { MyClass } from "../routes/myClass";
declare namespace Express {
  export interface Request {
    name: MyClass
  }
}

现在访问req.name时出现以下错误:

error TS2339: Property 'name' does not exist on type 'Request'.

我发现,由于添加了express.d.ts声明,我的import实际上变成了一个“模块”。不过,我不清楚如何克服我的问题。

答案

正如注释中提到的@unional,一旦在文件中进行顶级导入或导出,文件中的顶级作用域就会变为模块作用域,与全局作用域分开。

要修改模块中的全局声明,必须使用declare global在全局命名空间中引用Express

import { MyClass } from "../routes/myClass";
declare global {
  namespace Express {
    export interface Request {
      name: MyClass
    }
  }
}

以上是关于Typescript自定义类型定义在导入类上中断的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中正确导入自定义类型

具有自定义类型的TypeScript clone自我实例

如何使用 TypeScript 导入自定义 node.js 插件模块

如何在 cypress typescript 项目中正确导入自定义命令?

如何在 TypeScript 中创建自定义类型

找不到带有 Webpack、Typescript、自定义模块目录的模块