πŸ“˜ TypeScript/κ°œλ…

[μ½”λ”©μ• ν”Œ] νƒ€μž…μŠ€ν¬λ¦½νŠΈ HTML μ‘°μž‘μ‹œ 주의점 (1)

Zoeeey 2023. 12. 17. 13:19

μš°μ„ ..

{
  "compilerOptions": {
    ...
    "strictNullChecks": true,
    ...
  },
}

tsconfig.json νŒŒμΌμ—μ„œ strictNullCheck μ˜΅μ…˜μ„ true둜 λ°”κΎΌλ‹€. (ν˜Ήμ€ "strict" : true둜 써둬도 λœλ‹€) μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ TypeScript μ»΄νŒŒμΌλŸ¬λŠ” 더 μ—„κ²©ν•œ κ·œμΉ™μ„ μ μš©ν•˜λ©°, λ³€μˆ˜μ— λŒ€ν•œ null 체크가 κ°•μ œλœλ‹€.


HTML μ‘°μž‘μ‹œ 였λ₯˜

let title = document.querySelector('#title');
title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”'; // title is possibly Element | null

TypeScriptμ—μ„œ strictNullChecks μ˜΅μ…˜μ΄ ν™œμ„±ν™”λœ 경우, μœ„ λ©”μ„œλ“œμ˜ λ°˜ν™˜ νƒ€μž…μ€ Element | null둜 μ„€μ •λœλ‹€. λ”°λΌμ„œ title λ³€μˆ˜μ˜ νƒ€μž…μ€ Element | null이 λœλ‹€.
그리고 μ΄λ ‡κ²Œ νƒ€μž…μ΄ Element | null둜 μ§€μ •λœ λ³€μˆ˜λŠ” ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ null 체크λ₯Ό κ°•μ œλ°›κ²Œ λœλ‹€. 즉, title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”';μ—μ„œλŠ” title이 null일 수 μžˆμœΌλ―€λ‘œ null 체크 μ—†μ΄λŠ” μ½”λ“œκ°€ ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.


해결방법

1. λͺ…μ‹œμ μœΌλ‘œ null 체크

null 체크λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•  μˆ˜λ„ μžˆλ‹€.

let title = document.querySelector('#title');

if (title !== null) {
  title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”';
} else {
  console.error('Element with id "title" not found.');
}

μ΄λ ‡κ²Œ ν•˜λŠ” μ΄μœ λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ λŸ°νƒ€μž„μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 잠재적인 였λ₯˜λ₯Ό 사전에 λ°©μ§€ν•˜κ³  μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•¨μ΄λ‹€. λ•Œλ¬Έμ— κ°œλ°œμžλŠ” λͺ…μ‹œμ μœΌλ‘œ null 체크λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ˜λ„μΉ˜ μ•Šμ€ 였λ₯˜λ₯Ό λ°©μ§€ν•  ν•„μš”κ°€ μžˆλ‹€.

2. optional chaining (?.μ—°μ‚°μž)

let title = document.querySelector('#title');
title?.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”'; // title이 null이면 λ¬΄μ‹œλ¨

이 μ½”λ“œλŠ” μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž (?.)λ₯Ό μ‚¬μš©ν•˜μ—¬ title이 null이 μ•„λ‹Œ κ²½μš°μ—λ§Œ innerHTML 속성에 μ ‘κ·Όν•œλ‹€. λ§Œμ•½ title이 null이면 ν‘œν˜„μ‹μ΄ μ€‘λ‹¨λ˜κ³  할당이 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

let title = document.querySelector('#title');
if (title?.innerHTML) {
  title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”';
} else {
  console.error('idκ°€ "title"인 μš”μ†Œλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.');
}

μœ„μ²˜λŸΌ if-elseλ₯Ό μ‚¬μš©ν•˜μ—¬ λ”μš± λͺ…μ‹œμ μœΌλ‘œ μ œμ–΄ν•  μˆ˜λ„ μžˆλ‹€.

3. instanceof μ—°μ‚°μž

let title = document.querySelector('#title');

if (title instanceof Element) {
  title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”';
} else {
  console.error('Element with id "title" not found.');
}

title λ³€μˆ˜μ˜ νƒ€μž…μ„ narrowingν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

(Element μžλ¦¬μ— classλ₯Ό λ„£κ³  title μžλ¦¬μ— objectλ₯Ό λ„£μœΌλ©΄ ν•΄λ‹Ή objectκ°€ class의 instance(μžμ‹)인지 체크할 수 μžˆμ–΄μ„œ κ°€μž₯ 많이 μ“°κ²Œ 될 것이라고)

4. as (type assertion)

let title = document.querySelector('#title') as Element;

title.innerHTML = 'μ•ˆλ…•ν•˜μ„Έμš”';

λ„˜ μœ„ν—˜ν•˜λ‹ˆ 자주 μ“°μ§€ 말자. νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ“°λŠ” μ΄μœ κ°€ 없어짐


좜처 : μ½”λ”©μ• ν”Œ https://codingapple.com/ / TypeScript Documentation https://www.typescriptlang.org/docs/handbook/2/objects.html