차트는 멈췄는데 윈도우가 움직인다2026.05.26차트는 멈췄는데 윈도우가 움직인다TypescriptReactError Case#error-case#debugging#hooks2026.05.26차트는 멈췄는데 윈도우가 움직인다TypescriptReactError Case#error-case#debugging#hooks상황 어느날 서비스를 살펴보시던 팀장님께서 이런 말씀을 slack에 남기셨다. 진호님, 예측 차트에서 zoom을 계속하면 어느 순간 라인 차트가 아니라 단일 스캐터 차트처럼 보이는 데, 이거 수정하면 좋을 거 같아요. 어느정도 zoom을 하면 그 이후로는 zoom이 안 되도록 할 수 없…
Loose Autocomplete2025.09.14Loose AutocompleteTypescript#utility-type2025.09.14Loose AutocompleteTypescript#utility-type프로그래밍을 하다 보면 개발자가 의도한 선택지를 에디터가 자동완성으로 얼마나 잘 안내해 주느냐가 개발 경험에 큰 영향을 미친다는 사실을 자주 체감하게 된다. 특히 문자열 기반의 옵션을 다룰 때는 이 차이가 더욱 극명하게 드러난다. 예를 들어 HTTP 메서드를 표현할 때 "GET" | "…
더 좁은 타입의 유효성에 대하여2025.04.25더 좁은 타입의 유효성에 대하여Typescript잡생각2025.04.25더 좁은 타입의 유효성에 대하여Typescript잡생각사람이 무언가를 집중해서 바라보다 보면, 어느샌가 주변부가 흐려지고 가끔은 집중하고 있던 그 대상조차 보이지 않게 된다. 처음엔 분명하게 인식되던 경계가 서서히 사라지고, 오히려 애써 무시했던 주변이 본질을 가릴 때도 있다. 잘 보려 애쓰는 행위가, 역설적으로 시야를 좁히는 순간이다.…
재귀 조건부 타입에서의 추론 컨텍스트 손실2025.04.06재귀 조건부 타입에서의 추론 컨텍스트 손실Typescript#error-case#recursive2025.04.06재귀 조건부 타입에서의 추론 컨텍스트 손실Typescript#error-case#recursive타입스크립트에서는 조건부 타입의 분배 과정에서도 타입 추론 컨텍스트가 유지된다. 이 특성 덕분에 단순한 분기 수준을 넘어, 상당히 복잡한 조건부 타입에서도 개발자가 의도한 방향으로 타입 추론을 유도할 수 있다. 실제로 이러한 특성은 고급 유틸리티 타입을 설계할 때 매우 강력한 도구로 작…
유틸리티 타입 IsInRange2025.03.28유틸리티 타입 IsInRangeTypescript#recursive#utility-type#isinrange2025.03.28유틸리티 타입 IsInRangeTypescript#recursive#utility-type#isinrange프론트엔드 개발을 하다 보면 컴포넌트의 props로 number 타입을 받을 때가 많다. 하지만 단순히 number 타입만 지정하면 값의 범위를 제한할 수 없다는 점이 아쉽다. 예를 들어, 페이지네이션의 currentPage는 1 이상의 값만 허용해야 하고, 슬라이더의 value는 최소…
Equal but not Equal2025.03.11Equal but not EqualTypescript#utility-type#metaprogramming2025.03.11Equal but not EqualTypescript#utility-type#metaprogrammingTypeScript를 사용하다 보면, 겉보기에는 동일해 보이지만 실제로는 다르게 평가되는 타입을 마주치는 경우가 있다. 특히 객체 타입과 인터섹션 타입을 함께 다룰 때 이런 차이가 분명하게 드러난다. 다음 두 타입을 살펴보자. type A = { x: string; y: string }…
인터페이스와 추상 클래스2025.01.26인터페이스와 추상 클래스Typescript#readability#architecture#reflection#metaprogramming2025.01.26인터페이스와 추상 클래스Typescript#readability#architecture#reflection#metaprogramming언젠가 동생이 내게 이런 질문을 한 적이 있다. “형은 어떨 때 type을 쓰고 어떨 때 interface를 써?” 당시의 나는 대부분의 경우 type을 쓴다고 대답했다. 선언 병합을 제외하면 interface가 제공하는 기능적 이점을 크게 느끼지 못했기 때문이다. 실제로 타입스크립트에…
미들웨어 조합 구조에서의 unique symbol 활용기2025.01.22미들웨어 조합 구조에서의 unique symbol 활용기TypescriptJavascript#error-case2025.01.22미들웨어 조합 구조에서의 unique symbol 활용기TypescriptJavascript#error-case요즘 다른 전역 상태 라이브러리 대신 caro-kann 3 버전을 적극적으로 사용하고 있다. 여러 기능을 미들웨어 단위로 분리할 수 있어 번들 크기를 700B대까지 줄일 수 있었고, zustand, useReducer, useState 스타일을 상황에 따라 선택할 수 있다는 점도 다른…
유틸리티 타입 ReplacePropertyValue2025.01.10유틸리티 타입 ReplacePropertyValueTypescript#utility-type2025.01.10유틸리티 타입 ReplacePropertyValueTypescript#utility-type라이브러리를 개발하다 보면 객체 타입의 구조는 그대로 유지하면서, 일부 프로퍼티의 값 타입만 교체해야 하는 상황이 자주 발생한다. 특히 상속이나 오버라이드 패턴을 사용해 메서드의 동작 일부를 변경하는 경우가 대표적이다. 구현 관점에서는 기존 로직을 재사용하되, 외부에 노출되는 인터페이스…
객체 타입 지향2025.01.10객체 타입 지향Typescript#utility-type#object-oriented2025.01.10객체 타입 지향Typescript#utility-type#object-oriented아래는 전역 상태 관리 라이브러리 Caro-kann의 persist 미들웨어 내부에서 사용되는 유틸리티 함수들의 타입 정의이다. 세 타입 모두 storageKey와 storageType이라는 동일한 파라미터를 요구하고 있으며, 이 둘은 저장소의 위치와 종류를 식별하기 위한 핵심 정보라는…
타입스크립트에서의 컴포넌트 추론2024.11.10타입스크립트에서의 컴포넌트 추론TypescriptReactNext.js#component2024.11.10타입스크립트에서의 컴포넌트 추론TypescriptReactNext.js#component나는 꽤 오래 전부터 타입스크립트를 사용해 특정한 컴포넌트만을 걸러낼 수 있을지 궁금했다. 만약 이게 가능하다면 특정한 컴포넌트만을 children으로 받게 만들 수 있어 프로젝트의 전체적인 구조가 단단해질 거라 생각했다. 실제로 특정 컴포넌트를 걸러내기 위해서 나는 타입스크립트를 가지…
모든 것을 재귀적으로 구현한 댓글 기능2024.10.15모든 것을 재귀적으로 구현한 댓글 기능TypescriptReactNext.jsNest.js2024.10.15모든 것을 재귀적으로 구현한 댓글 기능TypescriptReactNext.jsNest.js내가 개인적으로 사용하는 독후감 기록 및 공유 서비스가 하나 있다. 이름은 onef다. 홍보에는 거의 신경 쓰지 않았기 때문에 실제 사용자는 나와 몇몇 후배들 정도에 불과하다. 하지만 전혀 문제는 없다. 이 서비스는 사용자 수를 늘리기 위한 제품이라기보다는, 구현해보고 싶은 기능을 부담…
에러도 테크닉이 될 수 있다2024.09.05에러도 테크닉이 될 수 있다TypescriptReactError Case#debugging#component2024.09.05에러도 테크닉이 될 수 있다TypescriptReactError Case#debugging#component상황 Button과 Link 및 여러 컴포넌트를 인자로 받아서 통일된 스타일을 처리해주는 Clickable 컴포넌트를 만들고 난 직후의 일이다. 로그인 페이지에서 Clickable 컴포넌트가 문제 없이 동작하는 걸 확인한 뒤 코드를 커밋했고, github action이 동작하며 라이브…
유틸리티 타입 Roll2024.07.17유틸리티 타입 RollTypescript#utility-type2024.07.17유틸리티 타입 RollTypescript#utility-typeform 관리 라이브러리 sicilian을 만들면서 입력 이벤트를 타입 안전하게 다루기 위해 여러 타입을 정의했다. 그 과정에서 아래와 같은 Input<K> 타입을 만들었다. export type Input<K> = ChangeEvent<HTMLInputElement> & { targe…
타입스크립트에서의 Array 타입2024.03.20타입스크립트에서의 Array 타입Typescript번역 및 정리2024.03.20타입스크립트에서의 Array 타입Typescript번역 및 정리이 포스트는 Dominik Dorfmeister가 자신의 블로그에 올린 Array types in TypeScript 게시글을 번역한 것이다. 번역하는 과정에서 다소 의역이 있을 수 있으며, 일부 번역에는 사견이 포함되어있기도 하다. 올해(23년) 초에 있었던 일입니다. Total Ty…