Programming

ES6 / Typescript에서 화살표 함수와 함께 _ (밑줄) 변수 사용

procodes 2020. 8. 26. 19:59
반응형

ES6 / Typescript에서 화살표 함수와 함께 _ (밑줄) 변수 사용


Angular 예제에서이 구조를 보았고 이것이 왜 선택되었는지 궁금합니다.

_ => console.log('Not using any parameters');

나는 변수 _는 상관 없음 / 사용하지 않음을 의미하지만 유일한 변수이기 때문에 _ 사용을 선호하는 이유가 있음을 이해합니다.

() => console.log('Not using any parameters');

확실히 이것은 입력하는 데 약 한 문자가 적을 수 없습니다. () 구문은 내 의견으로는 의도를 더 잘 전달하고 유형별로 더 구체적입니다. 그렇지 않으면 첫 번째 예제가 다음과 같아야한다고 생각합니다.

(_: any) => console.log('Not using any parameters');

중요한 경우, 이것이 사용 된 컨텍스트였습니다.

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}

(이 여기에 사용 된 이유를 가능하게하고)이 스타일을 사용할 수 있습니다 이유는 즉 _이상의 문자 짧다 ().

선택적 괄호는 선택적 중괄호 와 동일한 스타일 문제에 속합니다 . 이것은 대부분의 취향과 코드 스타일의 문제이지만 일관성 때문에 여기서는 장황함이 선호됩니다.

화살표 함수는 괄호가없는 단일 매개 변수를 허용하지만 0, 단일 구조화, 단일 나머지 및 다중 매개 변수와 일치하지 않습니다.

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에서 수정 되었지만 linter 또는 IDE에서 경고를 _트리거 할 수도 있습니다 unused variable/parameter. 이것은 이것을하는 것에 대한 상당한 논쟁입니다.

_무시 된 매개 변수에 대해 일반적으로 사용할 수 있습니다 (다른 답변이 이미 설명했듯이). 이것이 허용 가능한 것으로 간주 될 수 있지만,이 습관은 _Underscore / Lodash 네임 스페이스 와 충돌을 일으킬 수 있으며 무시 된 매개 변수가 여러 개있는 경우 혼란스러워 보입니다. 이러한 이유로 적절한 이름의 밑줄이있는 매개 변수 (TS 2.0에서 지원됨)를 갖는 것이 유익하고, 함수 서명과 매개 변수가 무시 된 것으로 표시되는 이유를 파악하는 데 시간을 절약 할 수 있습니다 (이는 _매개 변수 의 목적을 바로 가기 로 무시 함).

let fn = (param1, _unusedParam2, param3) => { ... };

위에 나열된 이유 때문에 저는 개인적으로 _ => { ... }코드 스타일을 피해야 할 나쁜 톤이라고 생각합니다.


()구문은 의도 나은 이럴 전달하고 또한 더 타입 고유의 것입니다

정확히. ()함수가 인수를 기대하지 않고 매개 변수를 선언하지 않는다고 말합니다. 함수 .length는 0입니다.

를 사용 _하면 함수에 하나의 인수가 전달되지만 신경 쓰지 않는다는 것을 명시 적으로 나타냅니다. 함수 .length는 1이며 일부 프레임 워크에서는 중요 할 수 있습니다.

따라서 유형 관점에서 보면 더 정확한 작업 일 수 있습니다 (특히 입력하지 않고 any라고 말하면 _: Event). 그리고 당신이 말했듯이, 입력하기가 한 문자가 적기 때문에 일부 키보드에서 접근하기가 더 쉽습니다.


그런 것 같아요 _ =>그냥 사용 () =>하기 때문에 _이 JS처럼 단지 생략 매개 변수에 허용되지 않는 다른 언어에서 일반적입니다.

_ Go에서 인기가 있으며 Dart에서도 매개 변수가 무시되고 내가 모르는 다른 매개 변수를 나타내는 데 사용됩니다.


두 가지 사용을 구별하는 것이 가능하며 일부 프레임 워크에서는이를 사용하여 서로 다른 유형의 콜백을 나타냅니다. 예를 들어 노드 익스프레스 프레임 워크는 미들웨어 유형을 구분하기 위해 이것을 사용한다고 생각합니다. 예를 들어 오류 처리기는 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)

글을 썼을 때 나는 _화살표 기능을 사용하지 않고 화살표 함수를 만드는 유일한 방법 이라는 인상 ()을 받았기 때문에 사용하면 _약간의 이점이있을 수 있다고 믿게 되었지만 내가 틀렸다. @Halt는 주석에서 다른 변수처럼 작동하며 특수한 언어 구조가 아니라는 것을 확인했습니다.


I want to mention one more thing I realized about these underscore arrow functions while testing myself I didn't find mentioned anywhere. You can use the underscore in the function as a parameter, although this probably isn't intended usage since it's supposed to represent an unused parameter. For clarity, I wouldn't really reccomend using it this way. but it can be useful to know for things like codegolf, challenges where you write the shortest code (it turns out you can just use any character without ()). I could imagine some real use cases where libraries use this and you need to use it even if they didn't intend for that functionality.

Example:

// simple number doubling function
f = _=> {
    _ = _ * 2;
    return _;
}

console.log(f(2)); // returns 4
console.log(f(10)); // returns 20

Tested with Chrome console, Version 76.0.3809.132 (Official Build) (64-bit)

참고URL : https://stackoverflow.com/questions/41085189/using-underscore-variable-with-arrow-functions-in-es6-typescript

반응형