Angularの例でこのコンストラクトに出会いましたが、なぜこれが選ばれるのか疑問に思います。
_ => console.log('Not using any parameters');
変数_は気にしない/使用しないことを意味しますが、唯一の変数であるため、_を使用することを好む理由があります。
() => console.log('Not using any parameters');
確かに、これは入力するのに約1文字少なくすることはできません。 ()構文は、私の意見では意図をより良く伝え、また、より特定の型です。そうでなければ、最初の例は次のようになっているはずだと思います。
(_: any) => console.log('Not using any parameters');
重要な場合、これは使用されたコンテキストでした:
submit(query: string): void {
this.router.navigate(['search'], { queryParams: { query: query } })
.then(_ => this.search());
}
このスタイルを使用できる理由(およびおそらくここで使用した理由)は、_
が()
より1文字短いためです。
オプションの括弧は オプションの中括弧 と同じスタイルの問題に該当します。これはほとんどの場合、好みとコードのスタイルの問題ですが、一貫性のためにここでは冗長性が優先されます。
矢印関数は括弧なしで単一のパラメーターを許可しますが、ゼロ、単一の非構造化、単一の休符、および複数のパラメーターとは矛盾します。
let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };
is declared but never used
エラー TypeScript 2.0で修正済み アンダースコア付きパラメーターの場合、_
はリンターまたはIDEからunused variable/parameter
警告をトリガーすることもできます。これは、これを行うことに対するかなりの議論です。
_
は、無視されたパラメーターに通常使用できます(既に説明した他の答えとして)。これは容認できると思われるかもしれませんが、この習慣は_
Underscore/Lodash名前空間と競合する可能性があり、複数の無視されたパラメーターがある場合も混乱します。このため、適切な名前のアンダースコア付きパラメーター(TS 2.0でサポート)を使用することは有益です。また、関数のシグネチャを理解する時間と、パラメーターが無視としてマークされる理由を節約できます(これはショートカットとしての_
パラメーターの目的に反します):
let fn = (param1, _unusedParam2, param3) => { ... };
上記の理由から、私は個人的に_ => { ... }
コードスタイルを避けるべき悪い調子だと考えています。
()
構文は、意図をより適切に伝え、より特定の型になります。
ではない正確に。 ()
は、関数が引数を必要とせず、パラメーターを宣言しないことを示します。関数の.length
は0です。
_
を使用すると、関数に1つの引数が渡されることを明示的に示しますが、それについては気にしません。関数の.length
は1になります。これは、一部のフレームワークで問題になる場合があります。
そのため、型の観点からは、より正確なことがあります(特にany
ではなく、たとえば_: Event
で入力する場合)。そして、あなたが言ったように、それはいくつかのキーボードで到達するのも簡単である入力するために1文字少ないです。
_ =>
は、JSのようにパラメータを省略することを許可されていない他の言語では一般的であるため、() =>
が_
に対して使用されるだけだと思います。
_
はGoで人気があり、Dartでも使用され、パラメーターが無視され、おそらく私が知らない他のパラメーターを示すために使用されます。
2つの使用法を区別することは可能です。一部のフレームワークでは、これを使用してさまざまなタイプのコールバックを表します。たとえば、ノードエクスプレスフレームワークはこれを使用してミドルウェアのタイプを区別すると思います。たとえば、エラーハンドラは3つの引数を使用し、ルーティングは2つの引数を使用します。
このような区別は、次の例のようになります。
const f1 = () => { } // A function taking no arguments
const f2 = _ => { } // A function with one argument that doesn't use it
function h(ff) {
if(ff.length==0) {
console.log("No argument function - calling directly");
ff()
} else if (ff.length==1) {
console.log("Single argument function - calling with 1");
ff(1)
}
}
h(f1)
h(f2)