타입 챌린지 191 - Append Argument

소파의 벨로그·2025년 3월 19일

타입챌린지

목록 보기
28/131

문제 링크

문제

함수 타입 Fn과 어떤 타입 A가 주어질 때 Fn의 인수와 A를 마지막 인수로 받는 Fn과 동일한 함수 유형인 G를 생성하세요.

내 풀이

type AppendArgument<Fn extends Function, A> = 
  Fn extends ((...args:infer Args)=>infer Result)?
    (...args:[...Args,x:A])=>Result
    :never;

infer 타입으로 인자를 추론 후, 그것을 라벨링된 튜플에 넣어줬다

다른 사람의 풀이

type AppendArgument<Fn extends (...args: any) => any, Type> = (...args: [...Parameters<Fn>, Type]) => ReturnType<Fn>

빌트인 타입으로 푼 방식도 존재했다

관련 개념

라벨링된 튜플 개념을 사용했다.

spread 연산자?를 통해 인자 타입을 설정하 ㄹ경우 인자의 이름을 잘 붙일 수 있도록 튜플에도 라벨링을 할 수 있는데, 이 부분을 사용했다.

예를 들어 라벨링이 되지 않은 튜플을 다음과 같은 타입을 인자타입으로 설정하게 되면
다음과 같이 동작한다.

(...args:[...Args,A])=>Result

그러나 내 방식처럼 라벨링을 할 경우 다음과 같이 동작한다

(...args:[...Args,x:A])=>Result

참고로 다음 pr을 통해 이 방식이 제안되었다.
(어쩌면 내 제안도 타입스크립트에서 받아들여질 수 있지 않을까..?)

참고자료

https://github.com/type-challenges/type-challenges/issues/3130
https://github.com/microsoft/TypeScript/pull/38234

0개의 댓글