TypeScript CLI 파서 Optique, 타입 안전성과 비동기 지원을 동시에!

by DD
5개월 전
조회수 15

Optique는 TypeScript 기반의 타입 안전한 CLI 파서로, 동기/비동기 모드를 지원하도록 개선됨.

object() 컴비네이터를 포함한 다양한 파서 조합 시, 타입 추론의 복잡성을 해결하기 위해 여러 디자인 옵션을 검토함.

runSync()runAsync() 함수를 도입하여, 컴파일 타임에 동기/비동기 모드를 강제하는 방식으로 API를 개선함.

타입 안전성을 위한 설계 옵션

Optique는 동기/비동기 모드를 지원하기 위해 여러 설계 방식을 시도했다. Conditional Types를 활용한 방식, Mode Parameter를 활용한 방식, 그리고 fp-ts 스타일의 HKT 시뮬레이션까지 다양한 접근법을 탐구했다. 따라서, 각 방식은 타입 안전성API 사용성 사이의 트레이드 오프를 가지며, 최종적으로 Backward Compatibility를 고려하여 Mode Parameter with default 방식을 선택했다.

성능 및 사용성 개선을 위한 API 설계

Optique는 run(), runSync(), runAsync() 함수를 통해 동기/비동기 실행 모드를 명시적으로 제어한다. 구체적으로, runSync()는 컴파일 타임에 동기 모드를 강제하여 타입 안전성을 확보하고, runAsync()는 비동기 작업을 지원한다. 반면, 이러한 API 분리는 API 사용성을 향상시키는 동시에, 개발자가 의도치 않게 비동기 코드를 동기 함수 내에서 호출하는 실수를 방지한다. 결과적으로, 타입 안전성개발 편의성을 모두 잡았다.

비동기 Value Parser 구현과 고려 사항

비동기 Value Parser 구현 시, Promise.resolve()를 사용하여 동기 함수를 비동기 시그니처에 맞게 래핑해야 하는 불편함이 존재한다. 구체적으로, parse() 함수는 항상 Promise를 반환해야 하며, 이는 작은 ergonomic issue로 이어진다. 따라서, per-method mode granularity를 도입하는 대신, unified mode를 유지하여 타입 시스템의 복잡성을 줄였다. 결과적으로, 코드 중복을 줄이고, 유지보수성을 높였다.

Designing type-safe sync/async mode support in TypeScript