138

可変量の引数を受け入れる関数メンバーとのインターフェースを定義するのに問題があります。例として、次のオブジェクトリテラルを取り上げます。

var obj = {
    func: () => {
        for(var i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
    }
};

次のようなインターフェイスを定義できるようにしたいと思います。

interface IExample {
    func: ( ??? ) => void;
}

次のコードがエラーなしでコンパイルできるように:

var test = (o: IExample) {
    o.func("a");
    o.func("a", "b");
    o.func("a", "b", "c");
    ...
}
4

3 に答える 3

255

TypeScriptはECMAScript6スプレッド提案を使用します。

http://wiki.ecmascript.org/doku.php?id=harmony:spread

ただし、タイプアノテーションを追加して、次のようにします。

interface Example {
    func(...args: any[]): void;
}
于 2012-10-05T03:53:12.203 に答える
6

チャックの答えに追加するために、そのように定義されたインターフェースを持つ必要はありません。...メソッドで直接実行できます。

class Header { constructor(public name: string, public value: string) {} }

getHeaders(...additionalHeaders: Header[]): HttpHeaders {
    let headers = new HttpHeaders();
    headers.append('Content-Type', 'application/json')

    if (additionalHeaders && additionalHeaders.length)
        for (var header of additionalHeaders)
            headers.append(header.name, header.value);

    return headers;
}

次に、それを呼び出すことができます:

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()))

または

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
于 2018-02-04T12:49:53.953 に答える
0

... args []引数が使用されていない場合でも、TypescriptはJavascriptに配列を作成し、それに引数をコピーします。

この不必要性を回避するために、関数と関数のプロトタイプを作成できます。したがって、次のようになります。

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
于 2018-05-21T14:34:31.277 に答える