7월, 2019의 게시물 표시

[TypeScript] Promise.all에는 인자 개수 제한이 없다

트위터에서 이상한 글을 봤다. TypeScript가 선언한 Promise.alliterable을 받지 않고 인자 개수 제한이 있다는 것이다. 근데 그럴 리가. TypeScript쯤 되는 프로젝트에서 무언가가 스펙과 다른 것으로 보인다면, 코드를 잘못 이해했을 확률이 높다. 코드를 다시 확인해보자.당연히 iterable을 인자로 받는 Promise.all선언도 있다. 다만, 이 선언이 es2015.promise.d.ts가 아닌 es2015.iterable.d.ts에 있을 뿐이다. 타입스크립트 컴파일러 옵션 중 --lib 으로 사용할 라이브러리를 지정할 수 있다. 대부분 es2015, es2018 같은 식으로 버전을 지정하여 포함하는 것이 일반적이라 잘 알려지지 않았지만, es2015.symbol로 Symbol에 대한 선언만 포함하거나, es2015.promise로 Promise에 대한 선언만 포함하는 것이 가능하다. 각 라이브러리는 서로 간에 의존성이 없도록 작성돼 있으며, 특히 iterable에 관련된 선언은 전부 es2015.iterable에서 선언한다. 예를 들어 Map이나 Setes2015.collection에 선언돼 있지만, iterable을 반환하는 entries, values, keys 등의 선언은 전부 es2015.iterable에 선언돼 있다. 마찬가지로 iterable을 인자로 받는 Promise.all 함수도 es2015.iterable에 선언돼있다.iterable을 받는 Promise.all 함수 선언은 es2015.iterable에 선언돼 있는데, es2015.promise에 10개가 더 선언돼있다. 이들은 무엇일까? 사실 이 함수들은 배열을 인자로 받는 함수가 아니라 tuple을 인자로 받는 함수 선언이다. JavaScript에는 임의 개수의 원소를 가지는 배열은 있지만, 고정된 개수의 원소를 가지는 tuple은 없다. 그래서 tuple이 필요할 때 배열을 사용한다. 이를 TypeScript에서는 별도의 타입으로 표시할 수 있도…