Typescript 如何在声明文件的命名空间中键入循环引用?

Typescript 如何在声明文件的命名空间中键入循环引用?,typescript,definitelytyped,.d.ts,Typescript,Definitelytyped,.d.ts,我正在尝试为DefinitelyTyped项目键入一个UMD模块(我没有这个模块,所以我无法更改它),它有如下内容(当然有实际的功能): 函数getModule(){ 函数fn1(){} 函数fn2(){} fn1.fn2=fn2; 返回fn1.fn1=fn1; } if(typeof define==“function”&&define.amd){ 定义(getModule()); }如果(模块类型!=“未定义”&&module.exports){ module.exports=getModu

我正在尝试为DefinitelyTyped项目键入一个UMD模块(我没有这个模块,所以我无法更改它),它有如下内容(当然有实际的功能):

函数getModule(){ 函数fn1(){} 函数fn2(){} fn1.fn2=fn2; 返回fn1.fn1=fn1; } if(typeof define==“function”&&define.amd){ 定义(getModule()); }如果(模块类型!=“未定义”&&module.exports){ module.exports=getModule(); }否则{ this.moduleName=getModule(); } 使用模板,到目前为止,我有以下几点:

export as namespace moduleName;

export = fn1;

declare function fn1(): void;

declare namespace fn1 {
    function fn2(): void;
}
然后,我生成了一个.d.ts文件,试图找出如何在
fn1
命名空间中再次声明
fn1
函数,结果如下:

/** Declaration file generated by dts-gen */

export = moduleName;

declare function moduleName(): void;

declare namespace moduleName {
    // Circular reference from moduleName
    const fn1: any;

    function fn2(): void;
}
然而,当我尝试在下面的代码中结合这两个元素时,我得到了一个错误,
“fn1”在它自己的类型注释中被直接或间接引用。

export as namespace moduleName;

export = fn1;

declare function fn1(): void;

declare namespace fn1 {
    function fn2(): void;
    const fn1: any;
}
我不想执行以下操作,因为这样做并不代表您可以执行
require('moduleName').fn1.fn1.fn1.fn2
(或任何数量的
fn1

export = moduleName;

declare function moduleName(): void;

declare namespace moduleName {
    function fn1(): void;
    function fn2(): void;
}


如何键入此模块?

您可以使用接口准确表示递归类型:

export = fn1;

declare const fn1: Fn1

interface Fn1 {
  // The call signature of fn1
  (): void
  // The circular reference
  fn1: Fn1
  // Other functions
  fn2: () => void
}