2016-07-30 9 views
1

Я немного смущен тем, как вы должны моделировать API в TypScript.Моделирование (long-ish) API в файлах деклараций Typcript

Я пытаюсь моделировать 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; 
} 

Однако , Я получаю такие вопросы, как:

Свойство 'register' не существует в типе 'typeof tag'.

Итак, как я могу моделировать это, кажется, что машинописный текст становится немного сложным после того, как вы объявили класс в пространстве имен в модуле, и ни один из этих типов не может существовать внутри себя?

Что будет a.b.c.d.e.f() выглядеть в файле .d.ts?

ответ

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>