SHIN STORYSHIN STORY
홈포스트C#TypeScriptNext.jsNode.js시리즈
</>SHIN STORY

sdf

탐색

  • 홈
  • 모든 포스트
  • 시리즈
  • 검색

카테고리

  • C#
  • TypeScript
  • Next.js
  • Node.js
  • 알고리즘
  • 개발 도구

© 2025 Shin Blog. All rights reserved.

GitHubRSS
목록으로
TypeScript#TypeScript

TypeScript 팁 #1 — strict 모드를 반드시 켜야 하는 이유

SHIN

2025년 4월 15일1분 읽기1
📚

TypeScript 실전 팁 10선

10편
  1. 5TypeScript 팁 #5 — 타입 가드로 런타임 타입 좁히기
  2. 6TypeScript 팁 #6 — 매핑 타입으로 타입 변환하기
  3. TypeScript 팁 #1 — strict 모드를 반드시 켜야 하는 이유현재
  4. 10TypeScript 팁 #2 — 유틸리티 타입 완전 정복
  5. 10TypeScript 팁 #3 — 판별 유니온으로 타입 안전한 상태 관리
  6. 10TypeScript 팁 #4 — 제네릭 제약 조건과 infer 활용
  7. 10TypeScript 팁 #7 — 템플릿 리터럴 타입으로 문자열 타입 조작
  8. 10TypeScript 팁 #8 — 선언 병합과 모듈 보강으로 타입 확장하기
  9. 10TypeScript 팁 #9 — 타입 안전한 에러 처리 패턴
  10. 10TypeScript 팁 #10 — 타입 성능 최적화와 실무 패턴

TypeScript 팁 #1 — strict 모드를 반드시 켜야 하는 이유

TypeScript를 쓰면서 strict: true를 빠뜨리면 절반만 쓰는 셈입니다. strict 모드가 어떤 검사를 활성화하는지, 왜 켜야 하는지 알아봅니다.

strict 플래그가 켜는 검사 목록

CODE
{
  "compilerOptions": {
    "strict": true
    // 아래 7개를 한 번에 활성화합니다
    // "strictNullChecks": true,
    // "strictFunctionTypes": true,
    // "strictBindCallApply": true,
    // "strictPropertyInitialization": true,
    // "noImplicitAny": true,
    // "noImplicitThis": true,
    // "alwaysStrict": true
  }
}

strictNullChecks — 가장 중요한 검사

CODE
// strict 없이 — 런타임에 터짐
function getLength(s: string) {
  return s.length  // s가 null이면 TypeError
}
getLength(null)  // 컴파일 통과 😱

// strict 켜면
function getLength(s: string) {
  return s.length
}
getLength(null)  // ❌ 컴파일 오류: null은 string에 할당 불가

noImplicitAny — any 암묵적 사용 차단

CODE
// strict 없이
function process(data) {  // data는 암묵적으로 any
  return data.toUpperCase()  // 런타임에 터질 수 있음
}

// strict 켜면
function process(data: string) {  // 타입 명시 강제
  return data.toUpperCase()
}

strictPropertyInitialization — 클래스 필드 초기화 검사

CODE
class UserService {
  // strict 없이: 초기화 안 해도 통과
  private db: Database

  // strict 켜면: 반드시 초기화하거나 타입을 명확히 해야 함
  private db!: Database          // 단언 (외부에서 주입 보장 시)
  private db: Database | null = null  // 명시적 null 허용
  constructor(db: Database) {
    this.db = db                 // 생성자에서 초기화
  }
}

기존 프로젝트에 점진적으로 적용하기

한 번에 strict를 켜면 오류가 수백 개 쏟아질 수 있습니다. 하나씩 켜는 방법을 권장합니다.

CODE
{
  "compilerOptions": {
    "noImplicitAny": true,       // 1단계: any 제거
    "strictNullChecks": true,    // 2단계: null/undefined 처리
    "strictFunctionTypes": true, // 3단계: 함수 타입 공변/반공변
    "strict": true               // 4단계: 나머지 전부
  }
}

tsconfig.json 권장 설정

CODE
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  }
}

noUncheckedIndexedAccess는 strict에 포함되지 않지만, 배열/객체 인덱스 접근 시 undefined 가능성을 체크해줘서 함께 켜는 것을 권장합니다.

strict 모드는 처음엔 불편하지만, 런타임 오류를 컴파일 타임으로 끌어올려 디버깅 시간을 크게 줄여줍니다.

공유
S

SHIN

.NET 개발자입니다

GitHub

이전 포스트

9편. Vercel 배포와 성능 최적화

다음 포스트

TypeScript 팁 #2 — 유틸리티 타입 완전 정복

TypeScript 팁 #2 — 유틸리티 타입 완전 정복

같은 카테고리 포스트

TypeScript 팁 #10 — 타입 성능 최적화와 실무 패턴

TypeScript 팁 #10 — 타입 성능 최적화와 실무 패턴

2025년 5월 3일· 3분
TypeScript 팁 #9 — 타입 안전한 에러 처리 패턴

TypeScript 팁 #9 — 타입 안전한 에러 처리 패턴

2025년 5월 1일· 2분
TypeScript 팁 #8 — 선언 병합과 모듈 보강으로 타입 확장하기

TypeScript 팁 #8 — 선언 병합과 모듈 보강으로 타입 확장하기

2025년 4월 29일· 2분

댓글