[이펙티브 타입스크립트] 아이템5 ~ 아이템8

Yongwoo Cho·2022년 5월 29일
0

TIL

목록 보기
75/98
post-thumbnail

[아이템5] any 타입 지양하기

any 타입에는 타입 안정성이 없다

any는 함수 시그니처를 무시한다
함수를 작성할 때는 시그니처를 명시해야 한다. 호출하는 쪽은 약속된 타입의 입력을 제공하고 함수는 약속된 타입의 출력을 반환한다. 그러나 any타입을 사용하면 이런 약속을 어길 수 있다.

function calAge(birth: Date): number {
  //...
}
let birthDate: any = '1995-05-18';
calAge(birthDate); // ❗ 에러표시안함

birth매개변수는 string이 아닌 Date 타입이어야 한다. any 타입을 사용하면 calAge의 시그니처를 무시한다.

any 타입에는 언어 서비스가 적용되지 않는다
어떤 심벌에 타입이 있다면 타입스크립트 언어 서비스는 자동완성 기능과 도움말을 제공하지만 any 타입인 심벌을 사용하면 아무런 도움을 받지 못한다.

any 타입은 코드 리펙토링 때 버그를 감춘다

any는 타입 설계를 감춘다

any는 타입시스템의 신뢰도를 떨어뜨린다
any 타입을 쓰지 않으면 런타임에 발견될 오류를 미리 잡을 수 있고 신뢰도를 높일 수 있다.

[아이템6] 편집기를 사용하여 타입 시스템 탐색하기

마우스 커서를 대면 타입스크립트가 그 타입을 어떻게 판단하는지 확인할 수 있으므로 이를 활용할 것

편집기상의 타입오류를 살펴보는 것도 타입 시스템의 성향을 파악하는데 좋은 방법이다

❗ 자바스크립트에서 typeof null은 "object"이므로 주의하기

타입스크립트가 동작을 어떻게 모델링하는지 알기 위해 타입 선언 파일(예를들어, lib.dom.d.ts)을 찾아보는 방법을 터득해야 한다.

[아이템7] 타입이 값들의 집합이라고 생각하기

  • never 타입 : 아무 값도 포함하지 않는 공집합
  • 리터럴 타입 : 한 가지 값만 포함하는 타입으로 유닛 타입이라고도 불린다
type A = 'A';
  • 유니온 타입 : 값 집합들의 합집합
type AB = 'A' | 'B';

❗ 유니온 타입에 속하는 값은 어떠한 키도 없기 때문에 유니온에 대한 keyof는 공집합 이어야만 한다.

집합의 관점에서, 타입 체크의 주요 역할은 하나의 집합이 다른 집합의 부분 집합인지 검사하는 것이라고 볼 수 있다.

[아이템8] 타입 공간과 값 공간의 심벌 구분하기

❗ instanceof 를 이용해 A 타입인지 체크하려고 할 때 instanceof는 자바스크립트의 런타임 연산자이고, 값에 대해서 연산을 하기 때문에 타입체크를 할 수 없다.

타입선언(:) 또는 단언문(as) 다음에 나오는 심벌은 타입인 반면, = 다음에 오는 모든 것은 값이다.

typeof 연산자

  • 타입의 관점 : typeof는 값을 읽어서 타입스크립트 타입을 반환한다. 보다 큰 타입의 일부분으로 사용할 수 있고, type 구문으로 이름을 붙이는 용도로도 사용할 수 있다.
  • 값의 관점 : 대상 심벌의 런타임 타입을 가리키는 문자열을 반환하기 때문에 ts의 타입과는 다름

❓ 런타임 타입이란?
👉 number, string, boolean, undefined, object, function

ts에서의 구조분해할당

function email({person, subject,body} : {person:Person, subject: string, body: string}){
  // ..
}

class나 enum 같은 키워드는 타입과 값 두 가지로 사용될 수 있다.

profile
Frontend 개발자입니다 😎

0개의 댓글