Typescript 如何在声明文件的命名空间中键入循环引用?
我正在尝试为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(); } 使用模板,到目前为止,我有以下几点: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
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
}