web-dev-qa-db-ja.com

ES6 / Typescriptの矢印関数で_(アンダースコア)変数を使用する

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());
}
89
Halt

このスタイルを使用できる理由(およびおそらくここで使用した理由)は、_()より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) => { ... };

上記の理由から、私は個人的に_ => { ... }コードスタイルを避けるべき悪い調子だと考えています。

71
Estus Flask

()構文は、意図をより適切に伝え、より特定の型になります。

ではない正確に。 ()は、関数が引数を必要とせず、パラメーターを宣言しないことを示します。関数の.lengthは0です。

_を使用すると、関数に1つの引数が渡されることを明示的に示しますが、それについては気にしません。関数の.lengthは1になります。これは、一部のフレームワークで問題になる場合があります。

そのため、型の観点からは、より正確なことがあります(特にanyではなく、たとえば_: Eventで入力する場合)。そして、あなたが言ったように、それはいくつかのキーボードで到達するのも簡単である入力するために1文字少ないです。

50
Bergi

_ =>は、JSのようにパラメータを省略することを許可されていない他の言語では一般的であるため、() =>_に対して使用されるだけだと思います。

_はGoで人気があり、Dartでも使用され、パラメーターが無視され、おそらく私が知らない他のパラメーターを示すために使用されます。

21

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)
9