TypeScript 유틸리티 유형을 테스트하는 방법

Typescript에는 코드 타이핑을 개선하는 데 도움이 되는 멋진 기능utility types이 있습니다.
다시 말하지만, 유틸리티 유형은 기능과 유사하지만 유형에 대한 것입니다. 이것이 의미하는 바는 유틸리티 유형이 types를 매개변수로 취하고 types를 출력으로 반환한다는 것입니다.
예를 들어 Parameters<T>라는 유틸리티는 다음과 같이 정의됩니다.

type Parameters<T extends (...args: any) => any> = 
     T extends (...args: infer P) => any ? P : never;


모든 함수 유형을 매개변수로 사용하고 모든 함수 매개변수의 Tuple를 반환합니다.
경우에 따라 고유한 사용자 지정 유틸리티 유형을 만들어야 합니다.
일반적으로 함수에 대한 일부 단위 테스트를 추가하는 경우 유틸리티 유형에 대해서도 동일한 작업을 수행할 수 있습니다.

그러나 그들을 테스트하는 방법? 이것은 테스트가 컴파일 타임에 실행되고 런타임에 오류를 보고하지 못한다는 것을 의미합니까? 좋아하는 테스트 러너로 이러한 테스트를 수행할 수 있습니까?

두 가지 유형을 비교하는 유틸리티



먼저 유틸리티 유형을 테스트하려면 최소한 유틸리티 유형의 출력을 예상되는 것과 비교해야 합니다.

첫 시도



시도해볼 수 있습니다this.

type Equals<T,U> = T extends U ? U extends T ? true : false : false;


이것이 true를 반환한다는 것을 깨달을 때까지 작동합니다.

type Test = Equals< 1, 1 | 2 >;


이는 typescript 조건부 유형이 작동하는 방식 때문입니다. distributive 조건부 타이핑을 하고 있습니다.

우리는 엄격한 유형 평등을 원하기 때문에 분산 동작을 비활성화하고 싶습니다.

분산 조건부 타이핑 비활성화



한 가지 방법은 내부에서 테스트하려는 유형을 숨기는 것입니다. 예를 들어 this과 같습니다.

type Equals<T,U> = [T] extends [U] ? [U] extends [T]? true: false : false;


지금 :

type Test = Equals< 1, 1 | 2 >;

false를 반환합니다.

그러나 우리는 아직 거기에 도달하지 못했습니다. 실제로 다음은 true를 반환합니다.

type Test = Equals< any, 1 | 2 >;


해결책




type Equals<T, U> =
    (<V>() => V extends T ? 1 : 2) extends
    (<V>() => V extends U ? 1 : 2) ? true : false;


이 솔루션은 TypescriptisTypeIdenticalTo의 내부 이해에 의존합니다. 자세한 설명은 여기issue에서 확인할 수 있습니다.

유틸리티 유형 테스트를 실행하는 데 사용하는 방법



테스트를 작성할 때 문제를 진단하는 데 도움이 되는 읽을 수 있는 메시지가 있어야 합니다.
따라서 이전 테스트를 다음과 같이 작성할 수 있습니다.

type Assert<T, U> =
    (<V>() => V extends T ? 1 : 2) extends
    (<V>() => V extends U ? 1 : 2) ? true : 
    { error: "Types are not equal"; type1: T; type2: U };


이제 Assert가 두 유형이 같지 않은지 확인하면 멋진 메시지를 받게 됩니다.
this과 같이 사용할 수 있습니다.

const test1: Assert<Parameters<(a: number)=>void>,[number]> = true; // pass
const test2: Assert<Parameters<(a: number)=>void>,[string]> = true; // fail


결론



Assert 유틸리티 유형(자체 테스트에도 사용할 수 있음)을 사용하면 자체 유틸리티 유형에 대한 단위 테스트를 추가할 수 있습니다.
그러면 실패 이유와 위치에 대한 좋은 메시지가 표시됩니다. 유틸리티 유형에 대한 유형 시스템에서 유형 스크립트 회귀를 모니터링할 수 있습니다.

실제로 보고 싶다면 tests here 라이브러리에 대해 일부 zodios을 확인할 수 있습니다.

이 글이 도움이 되셨다면 좋아요 누르는 것을 잊지 마세요.

좋은 웹페이지 즐겨찾기