TypeScript 유틸리티 유형을 테스트하는 방법
10816 단어 testingtutorialtypescripttooling
다시 말하지만, 유틸리티 유형은 기능과 유사하지만 유형에 대한 것입니다. 이것이 의미하는 바는 유틸리티 유형이
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;
이 솔루션은 Typescript
isTypeIdenticalTo
의 내부 이해에 의존합니다. 자세한 설명은 여기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을 확인할 수 있습니다.
이 글이 도움이 되셨다면 좋아요 누르는 것을 잊지 마세요.
Reference
이 문제에 관하여(TypeScript 유틸리티 유형을 테스트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ecyrbe/how-to-unit-test-your-typescript-utility-types-3cnm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)