검증하지 말고 파싱하라 — TypeScript처럼 원하지 않는 언어에서
요약
TypeScript의 타입 시스템 한계와 브랜디드 타입(Branded Type) 활용 시 발생하는 제약 사항을 다룹니다. 특히 배열 인덱싱에서의 타입 안전성 문제를 언급하며, Zig나 C++ 등 다른 언어의 사례를 통해 더 정밀한 타입 지정의 필요성을 논합니다.
핵심 포인트
- TypeScript의 브랜디드 타입은 논리적 오류를 방지하지만 배열 인덱싱에는 한계가 있음
- TypedArray 등 특정 구조에서 브랜디드 숫자를 활용한 인덱싱 지원이 필요함
- Zig의 EnumArray나 C++의 커스텀 배열 타입처럼 컴파일 시점의 정밀한 타입 지정이 유용함
- 언어 선택은 기술적 선호도뿐만 아니라 생태계와 팀의 숙련도 등 현실적 제약에 영향을 받음
JavaScript/TypeScript가 원하는 코드 스타일과 기술적·인체공학적으로 충돌한다면, 수많은 JS로 컴파일되는 언어 중 하나를 쓰면 되지 않나 싶음
Haskell, Elm, F#이 언급되고, PureScript, js_of_ocaml, Reason, LunarML 등 글쓴이가 더 쓰고 싶어 하는 계열의 언어도 많음. 글쓴이는 Why TypeScript Won’t Save You라는 글까지 쓰며 선호 언어들과 더 비교했고 https://learnelm.dev도 운영함.
아니면 비교 자체가 목적이라서, TypeScript가 많은 경우 충분하지 않다는 걸 보여주고 다른 도구체인이나 아이디어 채택을 유도하려는 건가 싶기도 함
기존 코드베이스, 팀의 특정 언어 숙련도나 회사 지침, 더 적은 지원·도구·커뮤니티 규모 같은 제약이 있음
대부분은 그냥 다른 언어를 고를 선택권이나 시간이 없음
보통은 큰 TypeScript 코드베이스가 있거나, 다른 언어에는 없는 TypeScript 라이브러리를 쓰기 때문일 것 같음
업무에서 브랜디드 타입(branded type) 을 아주 좋아하지만, 브랜디드 숫자로만 인덱싱 가능한 Array나 TypedArray를 만들 수 없다는 점이 정말 거슬림
TypedArray는 브랜디드 숫자를 저장하거나, 더 정확히는 꺼내 읽는 것조차 안 됨. IndexArray나 IndexTypedArray 같은 별도 타입 세트가 필요하더라도, 이런 기능이 꼭 있었으면 함
나도 브랜디드 타입을 좋아하지만, 얘기해보면 다들 들이는 노력에 비해 별로라고 봄
꽤 복잡한 데이터베이스 스키마에서 모든 ID에 브랜디드 타입을 쓰면, 말이 안 되는 조인이나 조건을 만들 때 TypeScript가 잡아줌. 함수 시그니처도 더 명확해지고 여러 실수를 만들기 어려워짐
충분히 세게 거짓말할 의향이 있다면, 브랜디드 숫자로만 인덱싱 가능한 Array를 만들 수는 있음
원한다면 TypedArray의 값에도 같은 식으로 가능함
직장에서는 “스마트 enum”과 커스텀 배열 타입을 써서 TArray<Foo, MyEnum>처럼 작성할 수 있음. 다만 이건 C++ 얘기임
Zig의 std 라이브러리에는 comptime으로 구현된 EnumArray가 있음. 조밀한 enum이나 희소한 enum을 인덱싱에 쓰고, 컴파일 시점에 올바른 인덱서를 계산하는 등 더 넓은 기능도 제공함.
이런 정밀한 타입 지정이 점점 마음에 듦. 코드베이스에 논리 버그가 들어오는 것 자체를 많이 막아줌
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기