---
id: wiki-2026-0508-typescript-49
title: TypeScript 4.9
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [TS 4.9, TypeScript satisfies]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [typescript, language-feature, satisfies, type-narrowing]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: typescript
  framework: tsc
---

# TypeScript 4.9

## 매 한 줄
> **"매 `satisfies` 의 type-check-but-keep-narrow"**. TS 4.9 (2022) 의 landmark feature `satisfies` operator 의 value 의 type 의 conform 의 verify, 매 inferred narrow type 의 preserve. 매 2026 perspective: 매 modern TS code 의 standard idiom — 매 TS 5.x baseline 의 무관 의 4.9 origin 의 know 의 worth.

## 매 핵심

### 매 satisfies 의 raison d'être
- `: T` 의 annotation 의 inferred type 의 widen — 매 narrow info 의 lose.
- `as T` 의 assertion 의 unsound — 매 type check 의 bypass.
- `satisfies T`: type check + inferred narrow 의 keep — 매 best of both.

### 매 4.9 다른 feature
- `in` operator 의 narrowing 의 unlisted property 의 improve.
- `NaN` 의 check 의 always-false 의 error.
- File watching 의 priority queue 의 perf 의 improve.
- `accessor` keyword (auto-accessor, ES decorator alignment).
- `--watchFile` 의 default 의 `useFsEvents` 의 change.

### 매 응용
1. Config object 의 typed 의 inferred autocomplete.
2. Discriminated union 의 literal 의 preserve.
3. Const map 의 key 의 narrow 의 keep.
4. Library API 의 generic constraint 의 expose 없 의 enforce.

## 💻 패턴

### Without satisfies (problem)
```typescript
type Colors = 'red' | 'green' | 'blue';
type RGB = [number, number, number];
type Palette = Record<Colors, string | RGB>;

const palette: Palette = {
  red: [255, 0, 0],
  green: '#00ff00',
  blue: [0, 0, 255],
};

palette.red.toUpperCase(); // ❌ string | RGB 의 type — 매 narrow 의 X
```

### With satisfies (solution)
```typescript
const palette = {
  red: [255, 0, 0],
  green: '#00ff00',
  blue: [0, 0, 255],
} satisfies Record<Colors, string | RGB>;

palette.green.toUpperCase(); // ✅ string 의 narrow
palette.red[0]; // ✅ number
```

### Satisfies + as const
```typescript
const routes = {
  home: '/',
  user: '/user/:id',
  admin: '/admin',
} as const satisfies Record<string, `/${string}`>;

type RouteName = keyof typeof routes; // 'home' | 'user' | 'admin'
```

### Discriminated union narrow
```typescript
type Event =
  | { kind: 'click'; x: number; y: number }
  | { kind: 'key'; code: string };

const events = [
  { kind: 'click', x: 10, y: 20 },
  { kind: 'key', code: 'Enter' },
] satisfies Event[];

events[0].x; // ✅ number 의 narrow — 매 Event[0] 의 X
```

### `in` narrowing 4.9 improvement
```typescript
function check(obj: unknown) {
  if (typeof obj === 'object' && obj !== null && 'foo' in obj) {
    obj.foo; // ✅ 4.9+ 의 unknown 의 access 의 allow
  }
}
```

### NaN check error
```typescript
const x: number = parseFloat('hello');
if (x === NaN) { } // ❌ TS 4.9: 'always false' error
if (Number.isNaN(x)) { } // ✅
```

### Auto-accessor (4.9 stage-3 decorator prep)
```typescript
class Person {
  accessor name: string = 'Anonymous';
  // 매 desugar 의 private field + get/set
}
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| Config object 의 type 의 enforce + autocomplete | `satisfies T` |
| Function return type 의 narrow 의 keep | `satisfies` 또는 generic inference |
| Type 의 widen 의 explicit 의 want | `: T` annotation |
| Type 의 trust me 의 unsafe | `as T` (last resort) |
| Const literal preserve | `as const satisfies T` |

**기본값**: 매 typed literal 의 `as const satisfies T` — 매 narrow + checked.

## 🔗 Graph
- 부모: [[TypeScript]] · [[TypeScript Advanced Type System]]
- 변형: [[as const]]
- 응용: [[TypeScript API Development]]
- Adjacent: [[Discriminated Union]] · [[Type Narrowing]]

## 🤖 LLM 활용
**언제**: 매 typed config / route map / palette 의 author, 매 narrow inference 의 keep.
**언제 X**: 매 explicit wide type 의 want (e.g. public API surface), 매 `: T` 의 prefer.

## ❌ 안티패턴
- **`as T` 의 always 의 use**: 매 unsound — 매 satisfies 의 first 의 try.
- **Annotation `: T` 의 narrow 의 lose 의 ignore**: 매 autocomplete 의 degrade.
- **Satisfies + as 의 mix**: 매 redundant 또는 conflict — 매 either 의 pick.
- **Generic constraint 의 satisfies 의 substitute**: 매 generic 의 best.
- **`NaN === NaN` 의 4.9 의 후 의 keep**: 매 build error — 매 `Number.isNaN`.

## 🧪 검증 / 중복
- Verified (TS 4.9 release notes Nov 2022, Microsoft DevBlog).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — satisfies, in narrowing, accessor |
