item52 테스팅 타입의 함정에 주의하기
유의점 1 : 반환값에 대한 테스트를 진행하지 않는다.
- 실행에서 오류가 발생하지 않는지만 체크한다.
const square = (x: number) => x * x;
// 실행에서 오류가 발생하지 않는지만 체크한다.
test("square a number", () => {
square(1);
square(2);
});
해결책
- 반환 타입을 지정해 준다.
declare function map<U, V>(array: U[], fn: (u: U) => V): V[];
const lengths: number[] = map(["john", "paul"], (name) => name.length); // 불필요한 변수를 선언해야한다.
// 불필요한 변수를 선언안해도 되는 개선된 코드
function assertType<T>(x: T) {} // 동일한 변수인지 확인하는 함수
assertType<number[]>(map(["john", "paul"], (name) => name.length));
유의점 2 : 두 타입의 동일한지 체크하는 것이 아니라 할당 가능성을 체크한다.
function assertType<T>(x: T) {} // 동일한 변수인지 확인하는 함수
declare function map<U, V>(array: U[], fn: (u: U) => V): V[];
// ex1) n은 리터럴 타입 12인데 할당 가능성 체크 통과
const n = 12;
assertType<number>(n);
// ex2) 반환값 { nmae : string, inYellowSubmarine : boolean } 반환 하지만 {name: string}에 대해서만 체크
const beatles = ["john", "paul", "george", "ringo"];
assertType<{ name: string }[]>(
map(beatles, (name) => ({
name,
inYellowSubmarine: name === "ringo",
}))
);
// ex3) 타입스크립트의 함수는 매개변수가 더 적은 함수 타입에 할당 가능해서 오류 안남
const double = (x: number) => 2 * x;
assertType<(a: number, b: number) => number>(double);
assertType 올바를 사용방법
parameters 와 return 타입을 나눠서 체크한다.
declare function map<U, V>(array: U[], fn: (u: U) => V): V[];
function assertType<T>(x: T) {}
const double = (x: number) => 2 * x;
let p: Parameters<typeof double> = null!;
assertType<[number, number]>(p); // 에러 [number]인수는 [number,number]에 할당 할 수 없습니다.
let r: ReturnType<typeof double> = null!;
assertType<number>(r);
유의점 3 : any가 있는 경우 테스트는 통과하는데 안정성을 포기한다.
- 암시적 any 타입을 발견하는 것은 어려움, 타입 체커와 독립적을 동작하는 도구를 사용해서 타입 선언을 테스트하는 방법이 권장된다. ex) dtslint
요약
- 타입을 테스트할 때는 특히 함수 타입의 동일성과 할당 가능성의 차이점을 알고 있어야한다.
- 타입 관련 테스트에서 any를 주의 해야한다.
https://effectivetypescript.com/
'Typescript' 카테고리의 다른 글
[TypeScript] Component Polymorphic하게 사용하기 (0) | 2024.01.27 |
---|---|
[Tspec] TypeScrip 기반 OpenApi Spec,Swagger 만들기 (0) | 2023.07.09 |
[TypeScript] 타입들 optional하게 변형하기 (0) | 2023.04.27 |
[Effective TypeScript] item51 의존성 분리를 위해 미러 타입 사용하기 (0) | 2023.04.04 |