타입스크립트 프로그래밍
컴파일러
- 자바스크립트 소스 추상문법트리AST로 파싱
- 바이트코드로 변환
- 런타임이 바이트 코드를 평가
런타임 : 다른 프로그램에 바이트코드를 입력해 평가하고 결과를 얻을 수 있음
타입 스크립트
- 타입스크립트 소스 - 타입스크립트 AST
- 타입 검사기가 AST를 확인
- 타입스크립트 AST - 자바스크립트 소스
타입검사기 : 코드의 타입 안정성을 검증하는 프로그램
개발자가 코드에 기입한 타입정보는 최종적으로 만들어지는 프로그램에 아무 영향을 주지 않는다!
타입 시스템
- 명시적으로 알려주는 타입 시스템
- 자동으로 추론하는 시스템
타입 스크립트는 두가지 모두 영향을 받아 명시할 수도, 추론하도록 할 수 도 있음
추론은 코드를 줄일 수 있는 방법
동적 타입 바인딩 : 프로그램을 실행해야만 타입을 알 수 있음
타입스크립트는 점진적으로 타입을 확인하는 언어, 모든 타입을 알아야 하는 것은 아니다.
올바르지 않아 보이는 연산은 의도적으로 명시를 해야 한다
자바스크립트는 런타임에 예외를 던지거나 암묵적인 형변환을 수행
타입스크립트는 컴파일 타임에 검출 할 수 있다는 것이 핵심!
any : 꼭 필요한 상황이 아니라면 사용하지 않는 것이 좋다.
unkown : 타입을 정제 하기 전까지 값을 쓸 수 없음
타입리터럴 : 오직 하나의 값을 나타내는 타입
let e : true = true;
- 숫자 분리자
1_000_000 // 1000000과 같음
bigint: number 253보다 더 큰 정수를 처리 할 수 있다. 플랫폼 지원 하는지 확인 필요
symbol : Symbol('a') 주어진 이름으로 새로운 심볼을 만듬, typeof a, const 에 할당하면 unique 심볼로 추론
let g : unique symbol
{}와 new로 만든 객체를 구분 할 수 없다, 자바스크립트는 구조기반타입을 쓰기 때문, 객체가 어떤 프로퍼티를 갖고 있는지를 따짐, 이름기반 타입에서는 이름을 따진다
object 타입은 애니보다 조금 더 좁은 타입, 자바스크립트의 객체일 뿐이라고 알려준다
객체리터럴 문법, 객체는 const로 선언해도 조금 좁은 타입으로 추론 하지 않는다.
빈객체타입은 null과 undefined를 제외한 모든 타입이 할당 될 수 있기때문에 피하는 것이 좋다 let danger : {}
Object타입, 빈객체와 비슷하다, 사용하지 않는 것이 좋다,빈객체 타입과 다른점은 object의 프로토타입 내장메서드를 정의 할 수 없음, tostring
타입 별칭은 블록스코프에서 덮어 쓸 수 있다.
type Color = 'red'
if(){
type Color = 'blue'
}
튜플
- 최소 한개의 string을 갖는 배열
let array : [string, ...string[]]
- 배열을 안전하게 관리하고 배열 타입의 길이도 조절, 순수 배열보다 안전성을 높일 수 있다.
enum
enum은 역방향찾기, 키값으로 접근하지 못하도록 const enum로 막을 수 있다. Language[0]
argument는 애니로 추론하기 때문에 가변인자를 사용할때는 (...numbers : number[])
제너레이터함수
여러개의 값을 생성할 수 있다, 값을 생성하는 속도 조절
제너레이터 함수는 이터러블 반복자를 반환
영구적으로 값을 생성 할 수 있음.
yield라는 키워드로 값을 방출
next로 소비
반복자 iteator
제너레이터로 스트림을 생성하고 반복자로 소비 next
호출 시그니쳐
호출 시그니쳐 : 타입 수준 코드, 타입 정보만 포함
type Greate = (name : string) ⇒ string;
구체타입 : 기대하는 타입을 정확하게 알 고 있을때
제네릭 : 플레이스홀더타입, 다형성 타입 매개변수
호출 시그니쳐에 제네릭으로 선언하고, 호출할 때 타입을 명시적으로 한정
type Filter<T> = {(array : T[], f : (item:T)→ boolean): T[])
타입 주도 개발 : 타입 시그니쳐를 먼저 정하고 값을 나중에 채우는 방식
타입스크립트는 완벽한 안정성을 추구하도록 서럐되지는 않았다. 실수를 잡는것과 쉬운사용이라는 두가지 목표를 균형 있게 달성하는 것이 타입 스크립트 타입 시스템의 목표
서브타입, 수퍼타입 : B가 A의 서브타입이면 A가 필요한 곳에는 어디든 B를 안전하게 사용 할 수 있, 슈퍼타입은 반대
가변성의 네종류
- 불변, 정확히 T를 원함
- 공변, <:T를 원함
- 반변, >:T 를 원함
- 양변, >:T 또는 <:T를 원함
복합 타입의 멤버는 공변, b에 할당 할 수 있는 A가 있다면 A의 각 프로퍼티 <: B의 대응 프로퍼티
함수의 매개변수는 반변
함수의 반환타입은 공변
할당성 : A타입을 다른B타입에 사용할 수 있는지 결정하는 규칙
타입 넓히기
- let, var와 같은 바꿀 수 있는 변수를 선언하면 리터럴값이 속한 기본타입으로 넓혀진다.
- null, undefined 로 초기화 된 변수는 any타입으로 넓혀진다.
- const를 사용하면 멤버들 까지 자동으로 readonly가 된다.
- 객체 타입은 그 멤버와의 공변이지만, 초과 프로퍼티 확인 기능때문에 존재하지 않는 프로퍼티를 가지고 있다면 에러로 처리
- 신선한 객체 리터럴 타입 : 타입스크립트가 객체 리터럴로부터 추론한 타입
- 객체 리터럴이 타입 어서션을 사용하거나 변수로 할당되면 일반 객체 타입으로 넓혀지면서 신선함이 사라짐
정제
- 타입 스크립트는 심벌 수행의 일종인 흐름 기반 타입 추론을 수행한다.
- 흐름 기반 타입 추론은 심벌 실행 엔진을 타입 검사기에 찹재해서 타입 검사기에 피드백을 제공하고 프로그래머가 추론하는 방식에 가까운 추론 매커니즘을 구현한다.
종합성
- 철저 검사 라고도 불리는 종합성은 필요한 모든 상황을 제대로 처리 했는지 검사하는 기능, 케이스 분에서 모든 케이스를 반환하지 않을 때, 이프안에서만 리턴할때 에러가 남