在 Typescript 声明文件中建模(长篇)API

Modelling (long-ish) APIs in Typescript declaration files

我有点困惑你应该如何在 Typescript 中建模 APIs。

我正在尝试对 hexo API 进行建模,例如用法,看起来有点像这样:

hexo.extend.tag.register(name, function(args, content){
  // ...
}, options);

到目前为止我得到的东西看起来像这样:

//hexo.d.ts
declare module 'hexo' {
    namespace extend {
        export class tag {
            public register: _register;
        }
    }
}

declare class _register {
    name: string;
    callback(args: any, content: any); 
    options: _options;
}

declare class _options {
    ends: boolean;
}

但是,我遇到了如下问题:

Property 'register' does not exist on type 'typeof tag'.

那么我应该如何建模,在模块的命名空间中声明 class 之后,Typescript 似乎变得有点棘手,并且这些类型中的 none 可以存在于其中他们自己?

a.b.c.d.e.f().d.ts 文件中会是什么样子?

一般来说,用new调用的东西只有class。否则就是 只是一个普通的对象。我会这样做:

declare module 'hexo' {
    class Hexo {
        constructor( cwd, opts )
        load() : Promise<any>
        extend : {
            console : any //declare me later, set any for now 
            // etc
            tag : {
                register(name:string, cb: (args,content) => void , opts : any)
            }
        }
    }
    export = Hexo;
}

export = something 当模块导出单个对象时使用(class Hexo 成为模块本身,而不是其中的对象)。

PS:可以使用 type 关键字引用回调类型(实际上是任何类型)。 type 关键字甚至可以替换 interface 关键字...

type someCallback = ( err : Error , resp : HttpResponse ) => Promise<any>