묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
reduce 타입을 만들다가 질문이 생겼습니다.
reduce 타입을 만들면서 initialValue는 옵션값이기때문에 값을 ?: 를 이용해서 만들었습니다. 그래서 있을때 없을때 모두 제대로 타입추론을 하는 것을 확인하였습니다.interface Arr<T> { reduce(callBackFn: (a: T, b: T) => T, init?: T): T; reduce<S>(callBackFn: (a: S, b: T) => S, init?: S): S; } const a: Arr<number> = [1, 2, 4, 5, 3]; const myReduce1 = a.reduce((a, b) => (a += b)); // 15 const myReduce2 = a.reduce((a, b) => (a += b), 10); // 25 const b: Arr<number | string> = [1, 2, "4", "5", 3]; const myReduce3 = b.reduce<number>((a, b) => { return typeof b === "number" ? (a += b) : a; }); // 6 const myReduce4 = b.reduce<number>((a, b) => { return typeof b === "number" ? (a += b) : a; }, 10); // 16 빌트인 reduce로 검사를 해보았는데 빌트인 reduce에서는 accumulator의 타입이 다른 경우 reduce 오버로딩되면서 init이 꼭 있어야 하는 타입으로 이해 했습니다. // 정답 // reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T; // reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T; // reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U; const c = [1, 2, "4", "5", 3]; const solReduce1 = c.reduce<number>((a, b, idx, arr) => { return typeof b === "number" ? (a += b) : a; }, 10); // 16 // error const solReduce2 = c.reduce<number>((a, b, idx, arr) => { return typeof b === "number" ? (a += b) : a; }); // 6 하지만 JS에서는 accumulator타입이 달라도 초기값없이 정상 작동하는 반면 TS에서는 초기값을 꼭 있어야 하는것인지 제가 잘못 이해하고 있는것인지 궁금해서 질문 남깁니다. error msg : TS2554: Expected 2 arguments, but got 1. lib.es5.d.ts(1480, 103): An argument for 'initialValue' was not provided. 질문 정리제가 작성한 reduce 타입이 올바르게 작성된 것인지TS에서는 빌트인 reduce를 사용할 떄 accumulator타입이 다를경우 init 값 없이 사용할 수 있는지입니다.감사합니다.
-
미해결함수형 프로그래밍과 JavaScript ES6+
reduce 함수 질문입니다!
강의 잘 듣고 있습니다. 항상 파이팅 입니다!이 강의에서 만든 Reduce 함수 궁금한 점이 있습니다. 이터러블 프로토콜을 활용해 배열의 첫번째 값을 초기값으로 설정 할 수 있는 것 까지는 알겠습니다. 기존 Array.prototype.reduce 에서는 초기값을 설정 할 수 있는데...arr.reduce((acc, cur) => blabla, {}) 요런 식으로빈 객체나 배열을 통해 새로운 객체나 배열을 만들 수 있는데이터러블 프로토콜을 활용해 만든 함수 reduce는 방법이 없나요제가 사용을 못하는 것일까요?? 방법이 있다면 어떤 방식으로 사용해야 할까요???
-
미해결함수형 프로그래밍과 JavaScript ES6+
reduce의 acc가 없는 경우 코드에 의문이 있어 질문드립니다.
안녕하세요! 초기값 acc가 없는 경우 iter에서 첫 값을 acc로 지정하고 next() 메서드를 통해 두번째 값부터 f(acc, a)를 누적하는 로직에서 궁금한 점이 있어 질문 남깁니다. 인자에 acc가 부재한 경우 if(!iter) 조건이 아니라 if(!acc) 조건으로 iter의 첫 값을 acc에 지정해주는 게 맞지 않나 싶었습니다. 해당 부분 시작 전에도 JS 내장 reduce 방식처럼 acc가 없는 경우 사용하는 방식이라고 소개하셔서 코드 부분에서 더 괴리가 있는 것 같습니다. 또한 acc[Symbol.iterator](); 의 경우 acc는 초기값이고, iterator 프로토콜을 따르는 배열은 인자로 주어진 iter니까 iter[Symbol.iterator]()가 맞지 않나요? const reduce = (f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } ... } 강의에서는 위와 같이 작성해주셨는데, 제가 생각했을 때 이해가 되는 코드는 아래와 같습니다. const reduce = (f, iter, acc) => { if (!acc) { iter = iter[Symbol.iterator](); acc = iter.next().value; } ... } acc가 없는 경우 인자가 2개가 들어온다고 생각하면, acc를 3번째 인자로 두어야 acc가 undefined라 !acc가 true 처리되어서 if문을 돌 것 같아서 순서를 바꿔보았습니다. 제가 배움이 얕아 잘못 생각하고 있는 것이라면 어떤 부분에서 잘못 생각하고 있는건지 여쭙고 싶습니다. 감사합니다. ----- 라고 생각했는데, 아예 iter랑 acc를 재지정해주셨다는 걸 알게 되었습니다. 다른 수강생들에게도 도움이 되기 위해 정리해보는데, 혹시 오류가 있다면 짚어주시면 감사하겠습니다. 초기값(acc)이 함수로 전달되지 않는 경우 인자가 당겨져서 if 문 이전까지는 acc가 iterable(배열)이고, iter가 부재해undefined가 됩니다. 그러면 초기값이 없다는 if 문의 판별 조건은 (!iter)가 됩니다. if문 내부에서는 acc가 iterable이니 이를 iter로 다시 지정하는 것이고, acc는 단어 뜻 그대로 초기값으로 설정하기 위해 iter.next().value로 iterable의 첫 값으로 지정합니다. next()를 해서 iterable은 두 번째 값부터 for문에서 iteration을 진행하게 됩니다. iter와 acc 단어 자체의 의미에 집중하다보니 이해가 되지 않았는데, 당겨진다고 생각하니까 바로 납득이 되네요. 오류가 있다면 지적 부탁드립니다. 감사합니다!
-
해결됨함수형 프로그래밍과 JavaScript ES6+
reduce 함수에서 nop 처리
안녕하세요 강사님 :) reduce 함수에서 비동기 값 a를 처리하기 위해서 reduceF를 정의하시고 사용하셨는데 함수 내부에서 풀어서 작성 했을시 정상적으로 동작하지 않더라구요 어떤 문제가 있어서 정상적으로 동작하지 않는것인가요 ? var reduce = curry((f, acc, iter) => { if(!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } else { iter = iter[Symbol.iterator](); } return go1(acc, function recur(acc) { let cur; while(!(cur = iter.next()).done) { const a = cur.value; acc = a instanceof Promise ? a.then(a => f(acc, a), e => e == nop ? acc : Promise.reject(e)) : f(acc, a) // acc = reduceF(acc, a, f); if (acc instanceof Promise) return acc.then(recur); } return acc; }); }); reduce(add, [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]) .then(log);
-
해결됨함수형 프로그래밍과 JavaScript ES6+
reduce 매개변수 acc는 무엇의 약자인가요?
안녕하세요 강사님 강의 아주 잘 듣고 있습니다 :) reduce 매개변수 acc는 무엇의 약자인가요?