TIR: Typescript | 함수(4) generator - 221009

Lumpen·2022년 10월 9일
0

TIR

목록 보기
38/40

제너레이터

제너레이터는 여러 개 값을 생성하는 편리한 기능을 제공한다
제너레이터 함수를 이용하면 값을 생산하는 속도도 조절할 수 있다

제너레이터는 게으르게 동작(요청을 해야만 다음 값을 계산) 하기 때문에
까다로운 기능을 제공할 수 있다

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}

함수 명 앞에 붙는 별표는 해당 함수가 제너레이터임을 의미한다

  • 제너레이터를 호출하면 이터러블 반복자가 반환된다
  • 제너레이터는 영구적으로 값을 생성할 수 있다
  • 제너레이터는 yield 라는 키워드로 값을 방출한다
    -> next() 호출을 통해 값을 요청하면 yield를 이용해 결과를 반환하고, 다음 next() 호출 시 까지 실행을 중지한다

반복자

반복자(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 등) 의 반복자도 정의할 수 있다

downlevelIteration

타입스크립트 ES2015 이전 버전의 자바스크립트로 컴파일 할 때는 tsconfig.json 에서 downlevelIteration 플래그러 커스텀 반복자를 활성화 할 수 있다
응용 프로그램의 번들 크기가 커지는 것을 원하지 않으면 비활성화 하는 것이 좋다

호출 시그니처

함수의 전체 타입을 표현하는 방법을 araboza
함수의 타입을 나타낼 때 Function을 사용할 수 있다
하지만 Function은 모든 함수에 대한 타입을 뜻할 뿐
특정 함수의 타입 정보는 가지고 있지 않다

(a: number, b: number) => number

이 코든는 타입스크립트의 함수 타입 문법으로
호출 시그니처, 타입 시그니처 라고 부른다

함수 호출 시그니처는 타입 수준 코드, 즉 값이 아닌 타입 정보만 포함한다
함수 호출 시그니처로 매개변수 타입, this타입, 반환 타입, 나머지 타입, 조건부 타입을 표현할 수 있다
하지만 기본 값은 타입이 아니라 값이기 때문에 표현할 수 없다

함수 호출 시그니처는 함수 몸체를 표현하지 않기 때문에
반환 타입을 명시해줘야 한다

타입 수준 코드: 타입과 타입 연산자를 포함하는 코드
값 수준 코드: 타입 수준 코드 외의 모든 코드

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글