타입으로 더하기 구현

뭔 개소린가 싶겠지만 가능하다.

먼저 이것부터 보자.

> [...[,,,], ...[,,]]['length']
5

일단 [,,, . . .] ([0, 0, 0 . . .]) 이걸 구현해보자.

type Arr<N extends number, V extends Array<number> = []> = // TODO

number N 을 받고
Array<number> 배열도 받자. (기본 [])

type Arr<N extends number, V extends Array<number> = []> =
	V["length"] extends N
		? V
	  	: Arr<N, [...V, 0]>

N이 0 (V ( [] )의 길이)이라면 그냥 []를 리턴하자.
아니라면 반복하자.

이제 Add 를 구현해보자.
아까 말한 [...[,,,], ...[,,]]['length']를 참고하면 쉽게 구현 가능하다.

type Add<A extends number, B extends number> = // TODO

A + B를 하기 위해 위 코드처럼 인자를 받도록 하자.

[...Arr<A>, ...Arr<B>] extends { length: infer L }
    ? L extends number    
      ? L
      : never
    : never;

[...Arr<A>, ...Arr<B>] extends { length: infer L }[...Arr<A>, ...Arr<B>]['length'] extends infer L 으로도 가능하다.

그렇게 완성된 코드,

type Arr<N extends number, V extends Array<number> = []> =
  V["length"] extends N
    ? V
    : Arr<N, [...V, 0]>;
  
type Add<A extends number, B extends number> = 
  [...Arr<A>, ...Arr<B>] extends { length: infer L }
    ? L extends number    
      ? L
      : never
    : never;

사실 개소리 맞다.

좋은 웹페이지 즐겨찾기