μ§€μ •λœ λ¬Έμžμ—΄λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” λ¬Έμžμ—΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ, λ¬Έμžμ—΄ μ‘°ν•© ν˜•μ‹ String Union Type을 μ‚¬μš©ν•©λ‹ˆλ‹€.

type Status = 'Todo' | 'InProgress' | 'Done';

const status: Status = 'Todo'; // βœ”οΈ OK
const status2: Status = 'None'; // ❌ Error

이 λ•Œ, λ¬Έμžμ—΄ μ‘°ν•© ν˜•μ‹μ΄ ν—ˆμš©ν•˜λŠ” λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜λ €κ³  ν•˜λ©΄, μ‰¬μš΄ 방법이 μƒκ°λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” μž„μ˜λ‘œ μž‘μ„±ν•œ μ½”λ“œμ΄κ³ , λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

const some: Status // ??
<select>
	{typeof(Status).map(status => <option value={status}>{status}</option>)} // ??
</select>

이λ₯Ό μœ„ν•΄ μ•„λž˜μ™€ 같이 ν˜•μ‹ μ •μ˜λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const statusTypes = ['Todo', 'InProgress', 'Done'] as const;
type Status = typeof statusTypes[number];

const status: Status = 'Todo'; // βœ”οΈ OK
const status2: Status = 'None'; // ❌ Error

첫번째, λ‘λ²ˆμ§Έ Status ν˜•μ‹ μ •μ˜λŠ” λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

이제 λ¬Έμžμ—΄ μ‘°ν•© ν˜•μ‹μ΄ ν—ˆμš©ν•˜λŠ” λ¬Έμžμ—΄μ„ μ‰½κ²Œ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<select>
	{statusTypes.map(status => <option value={status}>{status}</option>)} // πŸ™‚
</select>