Typescript를 이용한 자체 리듀스 방식

previous post에서 JavaScript에서 일부 고차 함수의 자체 버전을 구현하는 방법을 제시했습니다. 나는 그들 중 세 개를 다루었고 하나는 매우 강력한 하나가 누락되었습니다.
Array.prototype.reduce .

이 짧은 글에서는 Typescript를 사용하여 이 고차 함수에 대해 설명하고 싶습니다.

먼저 Array 프로토타입 유형을 확장해 보겠습니다. 확신이 서지 않는 부분입니다. Typescript 컴파일러는 불평하지 않지만 여기서 뭔가 잘못되었다고 생각합니다. 당신이 무엇을 알고 있다면, 알려주세요.

interface Array<T> {
    myReduce(cb: (previousValue: T, currentValue: T, index: number, array: T[]) => T, initialValue: T): T;
}


그리고 함수 자체는 다음과 같아야 합니다.

Array.prototype.myReduce = function<ReducedElem, ReducedValue>(callback: (previousValue: ReducedValue, currentValue: ReducedElem, index: number, array: ReducedElem[]) => ReducedValue, initialValue: ReducedValue): ReducedValue {
    let i = 0;
    let reduced = initialValue;

    if (arguments.length < 2) {
        i = 1;
        reduced = this[0];
    }
    for (i = 0; i < this.length; i++) {
        reduced = callback(reduced, this[i], i, this)
    }

    return reduced;
}


몇 가지 예를 통해 이 솔루션을 테스트했습니다.

// Classic usage - sum the numbers in the array
const numbers = [1, 10, 100, 1000];
numbers.myReduce((sum, curr) => sum + curr, 0) // Result: 1111

// Find the most recent date
const dates = [
  '1999/01/01',
  '2022/12/01',
  '2010/05/01',
  '2022/01/01'
];
dates.myReduce((max, curr) => curr > max ? curr : max, dates[0]) // Result: '2022/12/01'

// Flatten an array
const persons = [['Andrew', 'Joe'], ['Margaret', 'Sylvia'], ['Andrew', 'Rebecca', 'Joe', 'Sylvia']];
persons.myReduce((flatArray, currArray) => flatArray.concat(currArray), [])
/* [
      'Andrew', 'Joe', 'Margaret', 'Sylvia', 'Andrew', 'Rebecca', 'Joe', 'Sylvia'
   ]
*/


이 예제는 잘 작동하고 예상한 결과를 제공했습니다. Typescript 컴파일러는 이러한 예제에 대해서도 불평하지 않습니다.
타이핑 기능에 대한 자세한 내용은 Typescript 공식 사이트의 aFunctions chapter를 참조하는 것이 좋습니다.

좋은 웹페이지 즐겨찾기