如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?

Posted

技术标签:

【中文标题】如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?【英文标题】:How to import `ts` modules in a `d.ts` file that uses `declare namespace`? 【发布时间】:2020-12-04 05:56:51 【问题描述】:

我决定将整个项目所需的所有类型声明到一个 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


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

我该如何解决这个问题?

【问题讨论】:

想知道您是否能够找到解决方法? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?的主要内容,如果未能解决你的问题,请参考以下文章

Namespace declaration statement has to be the very first statement in the script

Namespace declaration statement has to be the very first statement in the script

win 环境下报错 Namespace declaration statement has to be the very first

Namespace declaration statement has to be the very first statement in the script-去除bom头

解决:function in namespace ‘std’ does not name a type + allocator_/nullptr/dellocator_ was not declare

PHP之namespace小记