TypeScriptのオープンエンド関数の引数


127

TypeScript言語の主な関心事の1つであるIMO は、既存のバニラJavaScriptコードをサポートすることです。一見した印象です。完全に有効な次のJavaScript関数を見てください。

注:私はこのアプローチが好きだと言っているのではありません。これは有効なJavaScriptコードです。

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
        agregatedNumber += arguments[i];
    }

    return agregatedNumber;
}

したがって、この関数は任意の数の引数とともに使用します。

console.log(sum(1, 5, 10, 15, 20));

ただし、これをTypeScript Playgroundで試してみると、コンパイル時にエラーが発生します。

これはバグだと思います。互換性の問題はないとします。次に、このタイプの関数をオープンエンドの引数で記述する方法はありますか?以下のようなparamsC#での機能?


2
気になるだけですが、なぜ名前付きnumbersパラメーターがあるのですか?あなたはそれで何もしていません。
ジャスティンモーガン

1
@JustinMorganに少なくとも1つのパラメータがあると、Intellisenseは少なくともいくつかの引数が必要であることを示唆します。
drzaus

回答:


267

TypeScriptでこれを行うに...は、引数の名前の前に省略記号演算子()を配置します。上記は、

function sum(...numbers: number[]) {
    var aggregateNumber = 0;
    for (var i = 0; i < numbers.length; i++)
        aggregateNumber += numbers[i];
    return aggregateNumber;
}

これにより、次のように正しくタイプチェックが入力されます

console.log(sum(1, 5, 10, 15, 20));

すごい!ありがとう。これは間違いなく進むべき道です。したがって、誰かが私の質問のように既存のコードを持っている場合、それは壊れます。正しい?
tugberk

1
はい。それは呼び出しについて不平を言いますが、シグネチャをsum(...)に変更することでsumを宣言して、任意のタイプの複数のパラメータを受け入れるように宣言できます。CodePlexのバグとしてこれを送信してください。
12

1
休憩パラメータの例を探していました。タイ。
午前

5

@chuckjの回答に加えてarrow function expression、TypeScript でも使用できます(lambdaJava / .NETの一種です)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}

4

Typescriptでは、これはRest Parameterの概念であり、類似したタイプの複数の値を受け取るパラメーターです。typescriptを対象とする場合は、コードECMAScript 6標準を記述する必要があります。次に、typescriptトランスパイラーがそれを同等のjavaスクリプトコードに変換します(これはECMAScript 5標準です。typescriptを使用する場合、関数sum(... numbers:number [])のように、restparameter変数名と共に3つのdot(...)preferxを使用する必要があります。

注: Restパラメーターはパラメーターlist.likewise関数sum(name:string、age:number、... numbers:number [])の最後のパラメーターでなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.