[이펙티브 타입스크립트] 2장 타입스크립트의 타입 시스템 (6,7,8장)

Urther·2022년 10월 2일
0

2장, 타입스크립트의 타입 시스템

타입스크립트는 코드를 JS로 변환하는 역할도 있지만, 가장 중요한 것은 타입 시스템에 있다.

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

타입스크립트를 설치하면 두 가지를 실행 할 수 있다.

  1. 타입스크립트 컴파일러(tsc)
  2. 단독으로 실행시킬 수 있는 타입스크립트 서버(tsserver)

편집기를 사용하면 타입스크립트 사용이 굉장히 수월해지는데 , 만약

let num=10;

라고 쓰여 있는 문제 num에 커서를 가져다 대면 number라는 num 심벌의 추론된 타입이 number 임을 보여준다.

아무도, num에 :number이라는 타입을 지정해주지 않았음에도 타입스크립트 자체적으로 number라는 타입이 추론되는 것이다. 위와 동일하게 function의 타입 또한 추론할 수 있다.

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

할당 가능한 타입들을 집합이라고 생각하면 편하다.

  • 유닛 타입이라고 불리는 리터럴 타입 예시
type A='A';  // A에는 'A' 밖에 들어오지 못한다.
type B='B'; // B에는 'B' 밖에 들어오지 못한다.

만약, 타입을 여러 개로 묶으면 Union을 사용하면 된다.

type UnionEx='A' | 'B';  // A에는 'A' 밖에 들어오지 못한다.

세 개로 묶을 때도 동일하게 | 를 사용해주면 된다. 유니온 타입은 집합의 합집함을 의미한다.

interface Person{
  name:string
}
interface Lifespan{
  birth: string
  death:string
}

type PersonSpan=Person & Lifespan

& 연산자는 두 타입의 인터섹션 (intersection, 교집합)으로 계산한다. 그러나 Person과 Lifespan에 공통으로 가지는 속성이 없으니 never라고 생각하기 쉽다. 그러나, 둘 다 가지는 속성 역시 타입 안에 들어온다.

const p:PersonSpan={
  name: '홍길동',
  birth: '2021-03-21',
  death: '2100-09-01'
} //정상

타입에서는 & 연산자를 쓰지만 interface로 타입을 선언한 경우에는 extends 키워드를 사용해준다.

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

시작하기전, 타입스크립트 내에서 심벌(Symbol)에 대하여

읽기 전 심벌이라고 해서 자바스크립트의 심벌이라고 생각하면 될까라는 고민을 했는데 아예 다른 의미로 쓰인 것 같다. 이펙티브 타입스크립트 책에서 사용하는 심벌은 변수 값이라고 생각하면 될 것 같다.

  • 타입으로 사용하는 심벌
    interface Cylinder { }
  • 값으로 사용하는 심벌
    const Cylinder = { }

둘은 Cylinder로 이름이 같지만 아무런 관련이 없다. interface와 type같은 키워드로 사용되는 심벌은 타입 공간에 존재하고 그 외는 값 공간에 있다. ⏤ 값 공간과 타입 공간이 분리 되어 있다고 생각하면 된다.

값은 타입을 가질 수 있지만, 타입은 값을 가질 수 없다.

연산자에서도 타입에서 쓰일 때와 값에서 쓰일 때 다른 기능을 하는 친구가 있다. => typeof

  • 타입의 관점에서
interface Person{
  first:string,
  last:string
}

const p:Person={first: 'Jane', last:'Jacobs'}

type T1=typeof p // 타입은 Person

타입의 관점에서, typeof는 값을 읽어서 타입스크립트 타입을 반환한다.

  • 값의 관점에서
interface Person{
  first:string,
  last:string
}

const p:Person={first: 'Jane', last:'Jacobs'}

const v1=typeof p;

값의 관점에서는 typeof는 자바스크립트의 런타입의 typeof 연산자가 된다.

profile
이전해요 ☘️ https://mei-zy.tistory.com

0개의 댓글