타입스크립트는 코드를 JS로 변환하는 역할도 있지만, 가장 중요한 것은 타입 시스템에 있다.
타입스크립트를 설치하면 두 가지를 실행 할 수 있다.
- 타입스크립트 컴파일러(tsc)
- 단독으로 실행시킬 수 있는 타입스크립트 서버(tsserver)
편집기를 사용하면 타입스크립트 사용이 굉장히 수월해지는데 , 만약
let num=10;
라고 쓰여 있는 문제 num에 커서를 가져다 대면 number라는 num 심벌의 추론된 타입이 number 임을 보여준다.
아무도, num에 :number
이라는 타입을 지정해주지 않았음에도 타입스크립트 자체적으로 number라는 타입이 추론되는 것이다. 위와 동일하게 function의 타입 또한 추론할 수 있다.
할당 가능한 타입들을 집합이라고 생각하면 편하다.
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 키워드를 사용해준다.
읽기 전 심벌이라고 해서 자바스크립트의 심벌이라고 생각하면 될까라는 고민을 했는데 아예 다른 의미로 쓰인 것 같다. 이펙티브 타입스크립트 책에서 사용하는 심벌은 변수 값이라고 생각하면 될 것 같다.
둘은 Cylinder로 이름이 같지만 아무런 관련이 없다. interface와 type같은 키워드로 사용되는 심벌은 타입 공간에 존재하고 그 외는 값 공간에 있다. ⏤ 값 공간과 타입 공간이 분리 되어 있다고 생각하면 된다.
값은 타입을 가질 수 있지만, 타입은 값을 가질 수 없다.
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 연산자가 된다.