Zoeeey
Stack flows in you
Zoeeey
  • λΆ„λ₯˜ 전체보기 (155)
    • πŸ’‘ UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • κ°œλ… (42)
      • 정리 (2)
      • λ¬Έμ œν’€κΈ° (ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€, μ½”λ”©μ• ν”Œ) (15)
      • μ‘μš©ν•˜μ—¬ μžλ™ν™”orλ¬Έμ œν•΄κ²°ν•˜κΈ° (2)
      • 기타 (5)
    • βš›οΈ React (49)
      • κ°œλ… (27)
      • κ°œλ…(Redux) (3)
      • 정리 (4)
      • λ¬Έμ œν’€κΈ° (μ½”λ”©μ• ν”Œ: React) (15)
    • πŸ“˜ TypeScript (10)
      • κ°œλ… (8)
      • λ¬Έμ œν’€κΈ° (μ½”λ”©μ• ν”Œ) (2)
    • 🌐 HTML,CSS (18)
      • μ‹€λ¬΄μ—μ„œ 자주 λ°œμƒν•œ 였λ₯˜λ“€ (10)
      • λ’€λŠ¦κ²Œ μ•Œμ•„μ„œ λΌˆμ•„ν”ˆ μœ μš©ν•œ CSS (6)
      • 기타 자주 μ“°λŠ” CSS (2)
    • πŸ’» CS (8)
      • CS (5)
      • μ •κ·œν‘œν˜„μ‹ (2)
      • Git,Github (1)

νƒœκ·Έ

  • redux
  • json
  • class
  • state
  • array
  • μ‚Όν•­μ—°μ‚°μž
  • object
  • UXUI
  • 였λ₯˜
  • CSS
  • Props
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
  • CS
  • Ajax
  • axios
  • JavaScript
  • μ½”λ”©μ• ν”Œ
  • TypeScript
  • useEffect
  • react
전체 방문자
였늘
μ–΄μ œ
hELLO Β· Designed By μ •μƒμš°.
Zoeeey

Stack flows in you

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

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

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

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ 동일쑰건

'πŸ“˜ TypeScript > κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[μ½”λ”©μ• ν”Œ] νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ class : constructor, prototype νƒ€μž…μ§€μ •  (0) 2023.12.20
[μ½”λ”©μ• ν”Œ] νƒ€μž…μŠ€ν¬λ¦½νŠΈ HTML μ‘°μž‘μ‹œ 주의점 (2) : 더 narrowingν•˜κΈ°  (1) 2023.12.17
[μ½”λ”©μ• ν”Œ] ν•¨μˆ˜μ™€ object λ©”μ„œλ“œμ— type alias μ§€μ •ν•˜κΈ°  (0) 2023.12.13
[μ½”λ”©μ• ν”Œ] νƒ€μž…μ„ νŠΉμ • κ°’μœΌλ‘œ μ§€μ •ν•˜μž : Literal Types (+ as const)  (0) 2023.12.13
[μ½”λ”©μ• ν”Œ] νƒ€μž…μ„ λ³€μˆ˜μ— λ‹΄μž : type alias  (0) 2023.12.11
    'πŸ“˜ TypeScript/κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [μ½”λ”©μ• ν”Œ] νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ class : constructor, prototype νƒ€μž…μ§€μ •
    • [μ½”λ”©μ• ν”Œ] νƒ€μž…μŠ€ν¬λ¦½νŠΈ HTML μ‘°μž‘μ‹œ 주의점 (2) : 더 narrowingν•˜κΈ°
    • [μ½”λ”©μ• ν”Œ] ν•¨μˆ˜μ™€ object λ©”μ„œλ“œμ— type alias μ§€μ •ν•˜κΈ°
    • [μ½”λ”©μ• ν”Œ] νƒ€μž…μ„ νŠΉμ • κ°’μœΌλ‘œ μ§€μ •ν•˜μž : Literal Types (+ as const)
    Zoeeey
    Zoeeey
    길게 μƒκ°ν•˜κ³  짧게 그리기

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”