제너레이터는 여러 개 값을 생성하는 편리한 기능을 제공한다
제너레이터 함수를 이용하면 값을 생산하는 속도도 조절할 수 있다
제너레이터는 게으르게 동작(요청을 해야만 다음 값을 계산) 하기 때문에
까다로운 기능을 제공할 수 있다
function* createFibonacci() {
let a = 0
let b = 1
while(true) {
yield a;
[a, b] = [b, a + b]
}
}
let fiboGenerator = craeteFibonacci() // IterableIterator<number>
fiboGenerator.next() // {value: 0, done: false}
fiboGenerator.next() // {value: 1, done: false}
fiboGenerator.next() // {value: 1, done: false}
fiboGenerator.next() // {value: 2, done: false}
함수 명 앞에 붙는 별표는 해당 함수가 제너레이터임을 의미한다
반복자(iterator)와 제너레이터는 상생관계다
제너레이터로 값의 스트림을 생성할 수 있고 반복자로 생성된 값을 소비할 수 있기 때문이다
iterable - 반복할 수 있는
Symbol.iterator 라는 프로퍼티를 가진 모든 객체
iterator - 반복자
next() 메소드를 정의한 객체 (value, done 두 프로퍼티를 가진 객체를 반환)
제너레이터 함수를 호출하면 Symbol.iterator 프로퍼티와 next 메서드를 모두 정의한 값을 얻게 된다
즉, 이터러블과 반복자 두 가지가 결합된 제너레이터가 반환된다
Symbol.iterator와 next를 구현하는 객체 또는 클래스를 만들어 반복자나 이터러블을 직접
정의할 수 있다
// 1 ~ 10 까지의 숫자를 반복하는 반복자 numbers
let numbers = {
*[Symbol.iterator]() {
for (let n = 1; n <= 10; n++) {
yield n
}
}
}
반복자 코드에 마우스를 올려서 타입 추론을 확인하면
let nubmers = {
[Symbol.iterator](): IterableIterator<number>
}
nubmers는 이터러블, 제너레이터 함수 numbers [Symbol.iterator]() 를 호출하면
이터러블 반복자가 반환된다
자바스크립트의 내장 컬렉션 타입(Array, Map, Set, String 등) 의 반복자도 정의할 수 있다
타입스크립트 ES2015 이전 버전의 자바스크립트로 컴파일 할 때는 tsconfig.json 에서 downlevelIteration 플래그러 커스텀 반복자를 활성화 할 수 있다
응용 프로그램의 번들 크기가 커지는 것을 원하지 않으면 비활성화 하는 것이 좋다
함수의 전체 타입을 표현하는 방법을 araboza
함수의 타입을 나타낼 때 Function을 사용할 수 있다
하지만 Function은 모든 함수에 대한 타입을 뜻할 뿐
특정 함수의 타입 정보는 가지고 있지 않다
(a: number, b: number) => number
이 코든는 타입스크립트의 함수 타입 문법으로
호출 시그니처, 타입 시그니처 라고 부른다
함수 호출 시그니처는 타입 수준 코드, 즉 값이 아닌 타입 정보만 포함한다
함수 호출 시그니처로 매개변수 타입, this타입, 반환 타입, 나머지 타입, 조건부 타입을 표현할 수 있다
하지만 기본 값은 타입이 아니라 값이기 때문에 표현할 수 없다
함수 호출 시그니처는 함수 몸체를 표현하지 않기 때문에
반환 타입을 명시해줘야 한다
타입 수준 코드: 타입과 타입 연산자를 포함하는 코드
값 수준 코드: 타입 수준 코드 외의 모든 코드