【问题标题】:Modelling (long-ish) APIs in Typescript declaration files在 Typescript 声明文件中建模 (long-ish) API
【发布时间】:2016-07-30 17:29:06
【问题描述】:

我对您应该如何在 Typescript 中建模 API 感到有些困惑。

我正在尝试对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;
}

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

类型“typeof tag”上不存在属性“register”。

那么我应该如何对此进行建模,在您在模块的命名空间中声明一个类之后,Typescript 似乎变得有点棘手,并且这些类型都不能存在于它们自身中?

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

【问题讨论】:

    标签: javascript typescript definition typescript-typings


    【解决方案1】:

    一般来说,如果用new 调用某个东西,它只是一个类。否则就是 只是一个普通的对象。我会做这样的事情:

    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 在模块导出单个对象时使用(Hexo 类成为模块本身,而不是其中的对象)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2021-03-25
      • 2017-09-21
      • 1970-01-01
      • 2016-09-27
      • 2018-05-12
      相关资源
      最近更新 更多