typescript 가변 인자를 받는 고차함수의 타입 질문.....

인자로 1개이상의 함수를 받아서 조합하는 함수가 있습니다…

0번째 함수와 1 ~ n 번째 함수가 서로 다른 타입이라면

type FuncOne; // 대충 함수타입
type FuncTwo; // 대충 다른 함수 타입

const hoc = (func: FuncOne, ...funcs: FuncTwo[]) => {
  // 사용 예: return funcs.reduce((acc, curr) => func(curr), [])
}

이럴수 있잖아요?

근데 이게 0 ~ (n-1) 함수와, n번째 (즉 맨 마지막) 함수가 서로 다를땐 어떻게 타입지정을 해야할까요?


const hocReverse = (...params: ?????) => {
  const func: FuncOne = params.slice(-1)[0];
  const funcs: FuncTwo[] = params.slice(0, -1);

  // 사용 예: return funcs.reduce((acc, curr) => func(curr), [])
}

이런식으로 하려는데 타입을 어떻게 해야할지 모르겠습니다…


우선 Array<FuncOne|FuncTwo> 는 안되네요… 생각해보니 안되는게 맞는거같고요

const hocReverse = (...params: Array<FuncOne|FuncTwo>) => {
    const func: FuncOne = <FuncOne>params.slice(-1)[0];
    const funcs: FuncTwo[] = <FuncTwo[]>params.slice(0, -1);

    return funcs.reduce((acc, curr) => func(curr), [])
}
1 Like
const hocReverse = (...params: (FuncOne|FuncTwo)[]) => {
	const func = <FuncOne>params.pop();
	const funcs = <FuncTwo[]>params;
        // 이렇게도 가능
        // const func = params.pop() as FuncOne;
        // const func = params as FuncTwo;
	return funcs.reduce((acc, curr) => func(curr), []);
}

저는 Array.prototype.slice보단 Array.prototype.pop을 쓰는 게 더 간편할 거라고 보네요.

2 Likes

감사합니다!!

감사합니다!!!