함수 타입 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