首页 > 解决方案 > 如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?

问题描述

我决定将整个项目所需的所有类型声明到一个d.ts文件中。

allTypes.d.ts

declare namespace PROJECT {

  interface MY_INTERFACE {
    // ...
  }

}

只需声明该命名空间,我就可以在我的所有项目文件中使用:

const something: PROJECT.MY_INTERFACE = {
  // ...
};

在此处输入图像描述

到目前为止,这一直有效。

但现在我需要声明一个基于现有 JS 对象的新类型。

@constants/COLLECTIONS.ts

export const COLLECTIONS = {
  PROP_A: "PROP_A",
  PROP_B: "PROP_B",
  PROP_C: "PROP_C",
};

所以我必须在我的allTypes.d.ts文件中执行以下操作。

allTypes.d.ts

import { COLLECTIONS } from "@constants/COLLECTIONS";

declare namespace PROJECT {

  interface MY_INTERFACE {
    // ...
  }

  type SOME_TYPE = keyof typeof COLLECTIONS   // THIS IS WORKING FINE

}

问题是,仅通过在importmy 的顶层执行此操作allTypes.d.ts,我的PROJECT命名空间对于我的项目文件不再可见。

在此处输入图像描述

在此处输入图像描述

我该如何解决这个问题?

标签: typescriptnamespacestypescript-typings.d.ts

解决方案


我对此进行了更多研究,此解决方案适用于我的情况https://stackoverflow.com/a/51114250/40769

像下面的例子一样使用 import inline 仍然允许使用脚本类型.ts/ .d.ts 文件。

declare namespace Express {
  interface Request {
    user: import("./user").User;
  }
}

这个答案也有一些关于“脚本”和“模块”ts文件之间区别的有用上下文: https ://stackoverflow.com/a/42257742/40769


推荐阅读