유형 인식 린팅 알파
Oxlint에서 유형 인식 린팅의 알파 버전을 발표하게 되어 매우 기쁩니다!
개요
8월 기술 프리뷰(기사 링크) 이후, 이제 유형 인식 린팅이 알파 상태에 도달했다는 소식을 전하며 기대감을 표합니다. 이번 마일스톤은 안정성, 구성 가능성, 규칙 커버리지 측면에서 중요한 개선을 제공합니다.
유형 인식 린팅은 no-floating-promises, no-misused-promises, await-thenable과 같은 강력한 규칙을 가능하게 하며, 이는 TypeScript의 유형 시스템을 활용해 버그를 탐지합니다. 지금까지 43개의 유형 인식 규칙이 제공되므로, 실행 시간 오류의 전체 범주를 미리 잡아낼 수 있습니다.
이 포스트에서는 다음과 같은 내용을 다룹니다:
- 빠른 시작 - 몇 분 안에 유형 인식 린팅을 시작할 수 있습니다
- 성능 - ESLint와 비교했을 때 얼마나 더 빠른지 확인하세요
- 기술 프리뷰 이후 새롭게 추가된 사항 - 새로운 기능 및 향상 사항
- 기술 세부 정보 - 유형 인식 린팅의 내부 동작 방식
- 앞으로의 계획 - 베타 릴리스를 위한 예정된 개선 사항
빠른 시작
oxlint와 oxlint-tsgolint를 설치하고, --type-aware 플래그로 실행하세요:
npm add -D oxlint oxlint-tsgolint@latest
npx oxlint --type-awarepnpm add -D oxlint oxlint-tsgolint@latest
pnpm oxlint --type-awareyarn add -D oxlint oxlint-tsgolint@latest
yarn oxlint --type-awarebun add -D oxlint oxlint-tsgolint@latest
bunx oxlint --type-aware특정 유형 인식 규칙만 테스트하려면(단, oxlint-tsgolint가 이미 전역 또는 로컬로 설치되어 있어야 함):
npx oxlint --type-aware -A all -D typescript/no-floating-promisespnpx oxlint --type-aware -A all -D typescript/no-floating-promisesyarn oxlint --type-aware -A all -D typescript/no-floating-promisesbunx oxlint --type-aware -A all -D typescript/no-floating-promises더 많은 구성 옵션은 우리의 사용 가이드를 참고하세요.
성능
| 프로젝트 | Oxlint + 유형 인식 | ESLint + typescript-eslint | 개선률 |
|---|---|---|---|
| vuejs/core | 2.531 s | 20.800 s | 8.22x |
| outline/outline | 4.448 s | 55.070 s | 12.38x |
테스트는 맥북 프로 M2 맥스 12코어(8개 성능 코어 + 4개 효율성 코어)에서 수행되었습니다.
우리의 성능 테스트 결과, oxlint에 유형 인식 린팅 기능을 적용하면 eslint + typescript-eslint보다 약 10배 빠릅니다. 자세한 내용은 우리의 성능 벤치마킹 리포지터리를 확인하세요.
또한, 유형 인식 린팅 중에 코드베이스를 동시에 유형 체크할 수도 있습니다. 대부분의 유형 정보는 이미 유형 인식 린팅 과정에서 계산되므로, 중복 작업을 피할 수 있습니다.
알려진 문제
tsgolint는 생산 코드베이스에서 테스트할 준비가 되어 있지만, 매우 큰 코드베이스를 다룰 경우 메모리 부족 문제가 발생할 수 있습니다. 다음 마일스톤에서 메모리 사용량 최적화를 진행 중입니다. tsgolint를 사용해보고 메모리 부족 문제를 tsgolint 저장소에 보고해 주시면 감사하겠습니다. 저희가 메모리 사용량을 개선하는 데 도움이 되도록 프로젝트에 대한 일부 세부 정보도 함께 제출해 주세요.
기술 프리뷰 이후 새롭게 추가된 사항?
린팅 중 유형 체크 지원
tsgolint는 이제 린팅 도중에 TypeScript에서 유형 체크 오류를 생성하는 기능을 지원합니다. 유형 인식 규칙은 이미 파일 내 모든 유형을 검사해야 하므로, 이를 버리기보다는 기존의 유형 정보를 재활용할 수 있습니다. 이는 특정 경우에 별도의 유형 체크 명령(tsc --noEmit 등)을 완전히 생략할 수 있음을 의미하며, CI에서 린팅과 유형 체크에 걸리는 총 시간을 줄여줍니다.
이는 실험적인 기능이지만, oxlint 명령에 --type-check 및 --type-aware 플래그를 추가하여 활성화할 수 있습니다:
$ oxlint --type-aware --type-check
× typescript(TS2322): Type 'number' is not assignable to type 'string'.
╭─[index.ts:1:7]
1 │ const message: string = 1
· ───────
╰────oxlint 내에서 규칙 구성 지원
tsgolint에서 실행되는 유형 인식 규칙은 다른 린트 규칙처럼 oxlint에서도 구성할 수 있습니다. 예를 들어, no-floating-promises 규칙을 특정 안전한 호출을 허용하거나 void를 무시하도록 설정할 수 있습니다:
{
"rules": {
"typescript/no-floating-promises": [
"error",
{
"ignoreVoid": true,
"allowForKnownSafePromises": [
{ "from": "file", "name": "SafePromise" },
{ "from": "lib", "name": "PromiseLike" }
]
}
]
}
}구성 옵션은 typescript-eslint가 지원하는 것과 일치하며, 각 규칙의 구성 섹션(예: no-floating-promises)에서 문서를 확인할 수 있습니다.
oxlint 내 인라인 비활성화 주석 지원
tsgolint에서 실행되는 규칙은 파일 내 또는 줄에 주석을 삽입함으로써 다른 oxlint 규칙과 동일하게 비활성화할 수 있습니다:
/* oxlint-disable typescript/no-floating-promises */
// oxlint-disable-next-line typescript/no-floating-promises
[1, 2, 3].map(async (x) => x + 1);더 많은 규칙 지원
우리는 typescript-eslint에서 인기 있는 규칙들을 계속해서 포팅해왔으며, 이제 oxlint를 통해 사용할 수 있습니다. 현재 tsgolint와 oxlint 조합은 43개의 유형 인식 규칙을 지원합니다.
초기 프리뷰 이후 아래 규칙들에 대한 지원도 추가되었습니다:
no-deprecated(가장 자주 요청된 규칙 중 하나)prefer-includesstrict-boolean-expressions
TypeScript 프로그램 진단 정보 이제 보고됨
이전에는, TypeScript가 프로그램을 생성하거나 분석하지 못했을 경우 이 오류들이 보고되지 않아 린팅이 작동하지 않는 이유에 대해 혼란스러웠습니다. 이제는 프로그램 생성에 문제가 발생할 경우, 그 오류를 진단 정보로 보고합니다. 이에는 tsconfig.json 파일 내 구성 문제도 포함됩니다.
예를 들어, tsconfig.json 파일에 baseUrl이 포함되어 있으면 오류로 보고됩니다. 왜냐하면 baseUrl은 TypeScript v7.0에서 제거되었기 때문입니다:
$ oxlint --type-aware
× typescript(tsconfig-error): Invalid tsconfig
╭─[tsconfig.json:4:3]
3 │ "compilerOptions": {
4 │ "baseUrl": ".",
· ─────────
5 │ "experimentalDecorators": true,
╰────
help: Option 'baseUrl' has been removed. Please remove it from your configuration.
See https://github.com/oxc-project/tsgolint/issues/351 for more information.유형 인식 규칙에 대한 자동 수정 지원
유형 인식 규칙은 이제 --fix 플래그를 통해 자동 수정을 지원합니다. oxlint --type-aware --fix를 실행하면, tsgolint의 수정 가능한 진단 정보가 일반 oxlint 수정과 마찬가지로 적용됩니다. 이로써 자동 수정 워크플로우에서 비유형 인식 규칙과 완전히 동등한 수준을 달성했습니다.
기술 세부 정보
아키텍처
Oxlint의 유형 인식 린팅은 독특한 두 바이너리 아키텍처를 사용합니다:
oxlint CLI (Rust)
├─ 파일 순회, 무시 로직, 진단 처리
├─ 유형 인식이 아닌 규칙 및 사용자 정의 JS 플러그인 실행
├─ 경로와 구성 정보를 tsgolint에 전달
└─ 결과를 포맷팅하고 표시
tsgolint (Go)
├─ 유형 체크에 직접적으로 typescript-go 사용
├─ 유형 인식 규칙 실행
└─ 구조화된 진단 정보 반환이 설계는 Oxlint의 핵심을 빠르게 유지하면서도, typescript-go를 통해 TypeScript의 유형 시스템을 활용합니다. 프론트엔드-백엔드 분리 덕분에 oxlint는 사용자 경험을 제어하고, tsgolint는 유형 분석의 부담을 맡습니다.
TypeScript 호환성
tsgolint는 typescript-go를 기반으로 합니다. 이는 마이크로소프트가 개발한, 차세대 타입스크립트인 타입스크립트 7.0을 위한 고 언어 기반 재작성입니다. 타입스크립트 7의 진행 상황에 대해서는 공식 타입스크립트 블로그 게시물을 참조하세요. 따라서 일부 더 이상 지원되지 않는 기능을 만나게 될 수 있습니다.
중요한 호환성 참고 사항:
- 타입스크립트 7.0 이상의 기능만 지원
- 7.0 이전 문법 및 폐기된 기능은 지원하지 않음
- 타입스크립트 7.0에서 제거된 레거시
tsconfig.json옵션(예:baseUrl)은 사용 불가
타입스크립트 6.0 이전의 폐기된 기능을 사용하고 있다면, 먼저 코드베이스를 마이그레이션해야 합니다. 폐기된 tsconfig 옵션 업데이트를 도와주는 타입스크립트 마이그레이션 가이드를 참고하세요.
구현 세부 사항
tsgolint는 typescript-go의 공개 API를 사용하지 않습니다. 대신, 내부 API를 샤이밍(임시 조작)하여 접근 가능하게 컴파일합니다. 우리는 typescript-go의 업데이트를 지속적으로 모니터링하고 필요 시 깨지는 변경 사항을 수정합니다.
우리의 typescript-go 파생 브랜치는 renovatebot을 통해 정기적으로 동기화되어 있으며, 최신 개선 사항과 수정 사항을 유지하고 있습니다. 타입스크립트 7.0이 공식적으로 출시되면, 메인 브랜치의 최신 버전이 아니라 안정된 릴리스를 따라갈 것입니다.
앞으로의 계획
우리는 베타 릴리스를 위해 다음과 같은 개선 사항을 적극적으로 추진하고 있습니다:
- 더 많은 규칙 지원 - 현재
typescript-eslint의 59개 유형 인식 규칙 중 43개만 지원하고 있습니다. 베타 릴리스를 향해 나아감에 따라 규칙 커버리지를 지속적으로 확장할 계획입니다. - 성능 및 메모리 사용량 개선 - 특히 매우 큰 모노레포에 대해 성능 최적화를 지속적으로 진행할 예정입니다.
감사의 말씀
다음 분들에게 진심으로 감사를 드립니다:
typescript-go를 개발해주신 타입스크립트 팀- 따뜻한 지원을 해주신
typescript-eslint팀 - @auvred 님이
tsgolint를 만드셨습니다. - @camchenry 님이 성능 개선 작업과 규칙 옵션 지원 구현에 기여해 주셨습니다.
체험해보기
준비되셨나요? 위의 빠른 시작 섹션으로 이동하여 유형 인식 린팅을 설치하고 실행해보세요.
유형 인식 린팅에 대한 피드백을 들려주시면 정말 기쁘고, 개발 워크플로우 개선에 어떻게 도움이 되었는지 보는 것도 기대됩니다.
커뮤니티와 연결해보세요:


