Typescript

[Effective TypeScript] item52 테스팅 타입의 함정에 주의하기

차노도리 2023. 4. 4. 17:51

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/

 

Effective TypeScript › 62 Specific Ways to Improve Your TypeScript

Effective TypeScript: 62 Specific Ways to Improve Your TypeScript

effectivetypescript.com