2016-07-06 11 views
0

型安全性を備えたTSで次のJSパターンを複製する方法はありますか?Typescriptでプロトタイプレスコンストラクタを実装する方法は?

function InputStream(input) { 
    var pos = 0, line = 1, col = 0; 
    return { 
     next : next, 
     peek : peek, 
     eof : eof, 
     croak : croak, 
    }; 
    function next() { 
     var ch = input.charAt(pos++); 
     if (ch == "\n") line++, col = 0; else col++; 
     return ch; 
    } 
    function peek() { 
     return input.charAt(pos); 
    } 
    function eof() { 
     return peek() == ""; 
    } 
    function croak(msg) { 
     throw new Error(msg + " (" + line + ":" + col + ")"); 
    } 
} 

私は型ヒントを追加した場合、私はこれを取得: - これまでのところ、とても良い

function InputStream(input: string) { 
    var pos = 0 
    var line = 1 
    var col = 0 

    return { 
     next, 
     peek, 
     eof, 
     croak 
    } 

    function next(): string { 
     var ch = input.charAt(pos++); 
     if (ch == "\n") line++, col = 0; else col++; 
     return ch; 
    } 

    function peek(): string { 
     return input.charAt(pos); 
    } 

    function eof(): boolean { 
     return peek() == ""; 
    } 

    function croak(msg):string { 
     throw new Error(`${msg} (${line}:${col})`); 
    } 
} 

TSはそうInputStreamと協力して、返されたオブジェクトのインタフェースを推測しますがタイプセーフであります。

私の問題は、インターフェイスのインスタンスとして引数をタイプヒントする方法がないようですね。

例えば(もちろん)、これは動作しません。

function TokenStream(input: InputStream) { 
    // ... 
} 

あらゆるタイプ-ヒントにする方法リターン型InputStream機能のとしてinput引数はありますか?

インターフェイスを明示的に宣言していないということは、インターフェイスを推論できることを前提に、冗長であると思われます。

もちろん、実際のクラスに移植することもできますが、これはより正しいと思われますが、code like thisは非常に冗長になります。

おそらくモジュールで同様のことを達成するための他の方法はありますか?私はモジュールがthisで修飾されずにモジュールで宣言された関数を呼び出すことができ、クラスメソッドと親クラスで可能であることを望んでいることに気付きましたが、TSチームはその要求を断りました。

答えて

0

あなたは実際にそのタイプを別の場所に置く必要がある場合は、そのInputStreamの戻り値をタイプしたいと思っています。あなたが求めているのは、「その関数によって返される型を教えてください」というようなメタデータのようなものです。タイプスクリプトにはそのような機能がありません。

小さなラムダ関数imoの推論は残されていることが最も良いです。参考のため

、あなたのような何かを行うことができます:

const input = InputStream('abcd') 

function TokenStream(input2: typeof input) { 

} 

しかし、あなたは何をしたい奇妙な、おそらくではない第二の機能、の引数を入力する実際の値を必要とします。

関連する問題