2012-10-16 13 views
16

headjsは、そのAPIに非常にクレイジーなJavaScript型のことをします。例えば、関数の文字列配列ではなく、任意の数の文字列を取ります。場合によっては、同じ関数呼び出しを終了させることもできます。オプションで関数呼び出しを終了することもできます。可変数/引数タイプの関数用のTypeScript宣言ファイル

head.js("scripturl1", "scripturl2",...,callback); 

また、(同じように簡単に)次

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback); 

私の質問は、いったい私たちは宣言ファイルであることを説明しますどのように行うことができますか?私の現在のパスが完全に間違っているように私はここにすべての耳です。

+0

(https://github.com/Microsoft/TypeScript/issues:それがなかった場合

、あなたはこのような何かを行うことができただろう/ 15190)これは私が他の場所で見た(適度に有用な)パターンであるためです。 – AJP

答えて

30

TS言語仕様では、可変数/拡散パラメータを「残りのパラメータ」と呼びます。残りのパラメータを受け入れる関数シグネチャのインターフェイスの例:

interface IExample { 
    fn : (...args : any[]) => any; 
} 

var x : IExample = { 
    fn: function(...args : any[]) { 
     for (var i = 0, arg; arg = args[i]; i++) { 
      console.log(arg); 
     } 
    } 
} 

x.fn(1); 
x.fn(1, 2); 
x.fn("cat", "dog", "mouse"); 

残念ながら、いくつかの制限があります。 "Rest Parameter"は関数のシグネチャの最後のものでなければなりません。そのため、繰り返しパラメータの後にあるので、コールバックパラメータの型を取得することはできません。私は[活字体の機能要求]を投稿している

var fn = function(cb: Function, ...args : string[]) { 
    ... 
} 
+0

しばらくの間トリアルリングしたあと、私は同じ結論に達しました。している...文字列:文字列[]、コールバック:()=>空しかし、悲しいかな幸運:-(..)投稿ありがとう。 –

+0

実際にはよりクリーンな解決法があります。これは技術的にはこの実際の質問に対する答えではありません(そうしなければならない場合には、ダウンボトムですが)。このような.... myFunc( "param1"、 "param2"、{"varParam1":4 "varParam2":3}); これは実際にはより読みやすいコードです。パラメータオブジェクトのインターフェイスを宣言したい場合は、上記のコードで正常に動作します。つまり、javascriptは既にRESTオブジェクトを処理する方法がとても素敵で、言語で可変引数関数も必要ないこともありません。TypeScrip –

+0

@ClayFerguson ... restパターンは1コールバックなどの他のパラメータとともに関数に渡すためのn個の値(おそらく0〜nの値?)例:[drop(arg1、arg2、...、argn、callback))](https://github.com/hapijs/hapi/blob/master/API.md#servermethodname-method-options) – AJP

-3

宣言は単純です:

function foo() { //... 

JavaScriptで関数宣言の関数の引数の一部がちょうど顧問です。関数を呼び出すときにJavascriptを使用すると、宣言された引数の数(デフォルトではundefinedに渡されない引数)より少ない数で、または宣言された引数の数を超えて呼び出すことができます。

関数が呼び出されると、arguments objectが作成されます。 argumentsオブジェクトは、渡された各引数を保持する配列のようなものです(ただし、適切なArrayオブジェクトではありません)。

function foo() { 
    for (var n=0; n<arguments.length; n++) { 
    alert(arguments[n]); 
    } 
} 

をだから今、あなたのようなfoo呼び出すことができます:

したがって、たとえば、あなたは、単に行うことができます無限の引数を処理するために、それを超えて

foo(1,2,3); 
foo(1,2,3,4,5,6,7,8); 

を、それが使用するだけで問題ですtypeof,などを使用して、どのタイプの引数が渡されたかを検出し、それに応じて処理します。

+0

私はこの背後にあるjavascriptを理解していますが、実際の質問はTypeScriptに特有のものでした...しかし投稿に感謝しています: –

関連する問題