requireしてnewして使用するnpmのパッケージにTypeScript用の型定義ファイルを書く
こういうの。
///<reference path='./typing/node.d.ts' /> ///<reference path='./typing/jsftp.d.ts' /> import JSFtp = require('jsftp'); .......................... var Ftp = new JSFtp({ host: connect.host, port: connect.port, user: connect.account, pass: connect.password }); ..........................
jsftp用に書いた型定義ファイル(簡略)
// ./typing/jsftp.d.ts /// <reference path="./node.d.ts" /> interface JSFtpOption { host?: string; port?: number; user?: string; pass?: string; .................... } declare module 'jsftp' { class Ftp { constructor(cfg?: JSFtpOption); put(from: string, to: string, callback?: (err: NodeJS.ErrnoException) => void): void; ....... } export = Ftp; }
参考
- https://github.com/borisyankov/DefinitelyTyped/blob/master/tspromise/tspromise.d.ts
これだとJSFTPOptionが他の型定義ファイルと重複してしまう可能性がないわけではない。
ちなみにexport = Ftpとしてやる必要がある*1ので、JSFTPOptionをmodule 'jsftp'の中に入れてexport JSFTPOptionとは出来ない。中に入れてexport付けないとコンパイル時にprivateだと怒られるし。
declare module 'jsftp' { class Ftp { constructor(cfg?: {host?:string;port?:number;user?:string;pass?: string}); put(from: string, to: string, callback?: (err: NodeJS.ErrnoException) => void): void; ........... } export = Ftp; }
オブジェクト型リテラルにすれば重複しないけど。 うーむ。
追記
@katahirado http://t.co/fQSZ6Qr7gU コレのmodule NodeJS みたいな感じで JSFTP専用モジュールに押し込んでしまうと重複しにくくて良いと思いますよ。 http://t.co/Lpl1CwFWfE
— わかめ@TypeScriptカッコガチ (@vvakame) 2014, 6月 16
おー、なるほど。
declare module JSFTP { export interface JSFtpOption { host?: string; port?: number; user?: string; pass?: string; ....................... } } declare module 'jsftp' { class Ftp { constructor(cfg?: JSFTP.JSFtpOption); put(from: string, to: string, callback?: (err: NodeJS.ErrnoException) => void): void; ............................................. } export = Ftp; }
このJSFTPモジュールは非インスタンス化モジュールで、型定義のネームスペースにしか存在しないので、変数空間を汚さないと。
ネームスペースを噛ませているので重複しにくくなりました。
勉強になりました。
ありがとうございます。
更に追記
@vvakame ありがとうございます。非インスタンス化モジュール…。なるほど、そんな方法が。
— Yuichi Katahira (@katahirado) 2014, 6月 16
あー・・・。TypeScriptリファレンス Ver.1.0対応の6-4-4インスタンス化・非インスタンス化モジュールに書いてあった。
読破したはずなのに覚えてなかった・・・。