Home ๐ŸŒ€ TS strict ์ ์šฉํ•˜๊ธฐ
Post
Cancel

๐ŸŒ€ TS strict ์ ์šฉํ•˜๊ธฐ

Prerequisite

tsconfig.json

1
"strict": true

related

์š”๋Ÿฐ family option๋“ค ๋ชจ๋‘์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•ด์ฃผ๋Š” ์˜ต์…˜์ด๋‹ค.

1. Null ํƒ€์ž… ์˜ค๋ฅ˜ ๋ฐ ํ•จ์ˆ˜ ํƒ€์ž… ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

Strict Null Check

1
2
3
function initEvents() {
  rankList.addEventListener('click', handleListClick);
}

rankList์— ๋Œ€ํ•œ null check๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ initEvents ํ•จ์ˆ˜ ์ตœ์ƒ๋‹จ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ Null check๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ํ•ด๊ฒฐํ•œ๋‹ค.

1
2
3
 if (!rankList) {
    return;
  }

Strict Function Type Check

function์˜ argument type์— ๋Œ€ํ•ด์„œ๋„ ์ •ํ™•ํ•˜๊ฒŒ ๋งž์ถฐ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  tsconfig.json์—์„œ โ€˜strictFunctionTypes:falseโ€™๋ฅผ ํ•˜๋ฉฐ ์—๋Ÿฌ๊ฐ€ ์‚ฌ๋ผ์ง€๊ธด ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด handleClick์ด๋ž€ ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , ์ด๊ฑธ something์— addEventListener๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1
2
3
4
5
something.addEventListener('click', handleClick)

async function handleClick(event: MouseEvent) {
//...
}

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด๋ณด๋ฉด ๋งจ ๋์— ์ด๋Ÿฐ ๋ฌธ๊ตฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

error

event์˜ Type์ด MouseClick์ธ๋ฐ addEventListener์˜ ์ฝœ๋ฐฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด๋ž‘ ํ˜ธํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ ๊ทธ๋ ‡๋‹จ๋‹ค. ํƒ€์ž…์„ MouseEvent โ†’ Event๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐฐ์šด์ : ๊ตฌ๊ธ€๋ง์„ ์ž˜ ํ•˜๊ธฐ ์ „์— ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ์ž˜ ํ™•์ธํ•˜์ž. ๊ตฌ๊ธ€๋ง์˜ ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2. แ„แ…กแ„‹แ…ตแ†ธแ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ธแ„แ…ณ แ„‚แ…ขแ„Œแ…กแ†ผ แ„แ…กแ„‹แ…ตแ†ธแ„‹แ…ด แ„‹แ…ฑแ„€แ…จ แ„€แ…ฎแ„Œแ…ฉ

DOM Element ํƒ€์ž… ํ˜ธํ™˜ ๊ด€๋ จํ•ด์„œ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

1
2
3
4
5
6
7
8
// hierarchy: a > b > c ์ˆœ์œผ๋กœ ๋†’๋‹ค.
const a: Element;
const b: HTMLElement;
const c: HTMLDivElement;
// hierarchy: ev1 > ev2 > ev3 ์ˆœ์œผ๋กœ ๋†’๋‹ค.
const ev1: Event;
const ev2: UIEvent;
const ev3: MouseEvent;

3. ํƒ€์ž… ๋‹จ์–ธ์„ ์ด์šฉํ•œ ํƒ€์ž… ์—๋Ÿฌ ํ•ด๊ฒฐ

1
recoveredList!.appendChild(li);

recoveredList ์˜ค๋ธŒ์ ํŠธ๊ฐ€ possibly null์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ ์ด๋•Œ โ€˜!โ€™๋ฅผ ๋’ค์— ๋ถ™์—ฌ์„œ non-null์ž„์„ ๋ช…์‹œํ•ด ํ•ด๊ฒฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฐ ํƒ€์ž… ๋‹จ์–ธ ์‹œ ์ฃผ์˜์ ์ด ์žˆ๋Š”๋ฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Food{
  type: string;
  price: number;
}

// type annotation
const sushi: Food = {
  type: Japanese;
  price: 18000;
}

// type assertion
const chicken = {} as Food;

ํƒ€์ž… ๋‹จ์–ธ์˜ ๊ฒฝ์šฐ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋œจ์ง€๋Š” ์•Š์ง€๋งŒ ์ดํ›„์— ์ดˆ๊ธฐ๊ฐ’์„ ์ •ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

4. ์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž

1๋ฒˆ์—์„œ์ฒ˜๋Ÿผ possible null ํƒ€์ž…์— ๋Œ€ํ•ด ๋งค๋ฒˆ ์ฒดํฌํ•ด์ค˜๋„ ๋˜์ง€๋งŒ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด optional chainig์„ ์“ฐ๋ฉด ๋” ๊ฐ„๊ฒฐํ•˜๋‹ค.

1
recoveredList?.appendChild(li);

5. DOM ์œ ํ‹ธ ํ•จ์ˆ˜ ํ™œ์šฉ์„ฑ์„ ๋†’์ด๋Š” ํƒ€์ž… ์ •์˜

์ด์ „๊นŒ์ง€๋Š” ์œ ํ‹ธํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

1
2
3
4
5
6
//util
function $(selector: string) {
  return document.querySelector(selector);
}
// DOM
const confirmedTotal = $('.confirmed-total') as HTMLSpanElement;

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ๋” ๊ฐ„๊ฒฐํ•ด์งˆ ์ˆ˜ ์žˆ๊ณ , ๋””ํดํŠธ๊ฐ’์„ ์ •์˜ํ•จ์œผ๋กœ์จ ๋” ๋น ๋ฅธ ๊ฐ„๊ฒฐํ•œ ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

1
2
3
4
5
6
7
//util - using generic
function $<T extends HTMLElement = HTMLDivElement>(selector: string) {
  const element = document.querySelector(selector);
  return element as T; // ๋ฆฌํ„ด ํƒ€์ž…์—์„œ Null ์—†์• ๊ธฐ
}
// DOM
const confirmedTotal = $<HTMLSpanElement>('.confirmed-total');

๊ฐ•์˜ ๋!


reference.

https://www.typescriptlang.org/tsconfig#strict

TS๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

๐ŸŒ€ Event, Axios type ์ •์˜

๊ธฐ๋ณธ๊ณผ ๋ณธ์งˆ