TypeScript

๐Ÿ“ƒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ž…๋ฌธ 08 : ํƒ€์ž… ๋‹จ์–ธ & ํƒ€์ž… ๊ฐ€๋“œ ์•Œ์•„๋ณด๊ธฐ

hjworld 2021. 3. 16. 09:31

๐ŸŽˆ ํƒ€์ž… ๋‹จ์–ธ ์•Œ์•„๋ณด๊ธฐ

var a;

์ด๋ ‡๊ฒŒ๋งŒ ์„ ์–ธํ•œ a์— ๋Œ€ํ•œ ํƒ€์ž…์€ any๊ฐ€ ๋˜๊ณ 

a = 20;

์ด๋ ‡๊ฒŒ ์ˆซ์ž๋กœ ๋Œ€์ž…ํ•œ a๋Š” ์ˆซ์ž๋กœ ์ถ”๋ก ์ด ๋œ๋‹ค.

a = 'a';

์–˜๋Š” ๋ฌธ์ž์—ด๋กœ ์ถ”๋ก ์ด ๋œ๋‹ค.

var b = a;

์–˜๋Š” ์›๋ž˜๊ฐ™์œผ๋ฉด ๋งจ ์ฒ˜์Œ์— ์„ ์–ธ๋œ any๊ฐ€ b์— ํ• ๋‹น๋œ๋‹ค.

var b = a as string;

์ด๋ ‡๊ฒŒ as ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›„์— ํƒ€์ž…์„ ์„ ์–ธํ•˜๋ฉด ์„ ์–ธ ํ•œ ํƒ€์ž…(string)์œผ๋กœ ์ง€์ •๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํƒ€์ž… ๋‹จ์–ธ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ๊ฐœ๋ฐœ์ž๊ฐ€ ํƒ€์ž…์„ ๋” ์ž˜ ์•Œ๊ณ ์žˆ๋‹ค๋ผ๋Š” ์˜๋ฏธ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋„ˆ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ๋ง๊ณ  ๋‚ด๊ฐ€ ์ •ํ•œ ํƒ€์ž…์— ๊ฐ„์ฃผํ•˜๋ผ... ์š”๋Ÿฐ ๋„ˆ๋‚Œ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋ฉด ๋œ๋‹ค.

 

๐ŸŽˆ DOM API ์กฐ์ž‘

<div id="app">hi</div>

var div = document.querySelector('div');

if (div) {
  div.innerText
}

์›นํŽ˜์ด์ง€์— ํƒœ๊ทธ๋ฅผ ์กฐ์ž‘ํ•ด์ค„ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” API๋Š” querySelector์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ DIV๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„ ํƒœ๊ทธ์— ์ ‘๊ทผํ•˜๋ฉด ์•Œ์•„์„œ HTMLElement๋ผ๊ณ  ์ถ”๋ก ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  if๋ฌธ์œผ๋กœ div๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ์„ ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์กฐ์ž‘์„ ํ•ด์ฃผ๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…๋‹จ์–ธ์˜ ํŒจํ„ด์ด๋‹ค. div๋ผ๋Š” ๊ฐ’์ด null์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ‘์— ํ˜ธ์ถœ๋œ div๊ฐ€ ์–ด๋–ค ๊ฑธ ๋ฐ๋ ค์˜ค๋Š”์ง€ div๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ if๋ฌธ์„ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋•Œ,

var div = document.querySelector('div') as HTMLDivElement;
div.innerText;

์ด๋ ‡๊ฒŒ as๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ HTMLElement๋กœ ํƒ€์ž…์„ ๋‹จ์–ธํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. as๋ฅผ ์“ฐ๋Š” ์‹œ์ ์—๋Š” ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐˆ ๋•Œ querySelector๊ฐ€ HTMLElement๋ผ๊ณ  ๋‹จ์–ธํ•ด์ค€๋‹ค. 

 

๐ŸŽˆ ํƒ€์ž… ๊ฐ€๋“œ ์•Œ์•„๋ณด๊ธฐ

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

function introduce(): Developer | Person {
  return { name: 'Tony', age: 33, skill: 'Iron Making'}
}

var Tony = introduce();
console.log(Tony.name);

if ((Tony as Developer).skill) {
  var skill = ((Tony as Developer).skill);
  console.log(skill);
} else if ((Tony as Person).age) {
  var age = (Tony as Person).age;
  console.log(age);
}

์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธํ•ด์ฃผ๊ณ , introduce๋ผ๋Š” ํ•จ์ˆ˜์— ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ Tony๋ฅผ ํ˜ธ์ถœํ•ด์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  if๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ๋‹จ์–ธ ๋ฐฉ์‹์œผ๋กœ as๋ฅผ ์จ๊ฐ€๋ฉฐ ํƒ€์ž…์ด ์žˆ๋‚˜ ์—†๋‚˜ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ฒซ ์ค„์—๋Š” Tony as Developer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒจ๋กœํผ์—  skill์ด ์žˆ๋‚˜ ์—†๋‚˜ ํ™•์ธ์„ ํ•œ ํ›„์— ์žˆ์œผ๋ฉด ๋˜ skill์ด๋ผ๋Š” ๊ฒƒ์„ ํ˜ธ์ถœํ•ด์ฃผ๋„๋ก ๋ณ€์ˆ˜์— ๋‹ด๋Š” ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๊ณ  ์—ฌ๋Ÿฌ๋ฒˆ ์„ ์–ธํ•ด์•ผ ๋œ๋‹ค๋Š” ๋ถˆํŽธํ•œ ์ ์ด ์žˆ์–ด ์ด๊ฒƒ์„ ๋ณด์™„ํ•œ ๊ฒƒ์ด ํƒ€์ž… ๊ฐ€๋“œ์ด๋‹ค.

 

๐ŸŽˆ ํƒ€์ž… ๊ฐ€๋“œ ์ •์˜

function isDeveloper(target: Developer | Person): target is Developer {
  return (target as Developer).skill !== undefined;
}
if (isDeveloper(Tony)) {
  console.log(Tony.skill) 
} else {
  console.log(Tony.age) 

ํƒ€์ž…๊ฐ€๋“œ ํ•จ์ˆ˜๋Š” is๋ผ๋Š” ํŒจํ„ด๊ณผ target์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  skill์ด๋ผ๋Š” ๊ฐ’์ด ์žˆ์„ ๋•Œ !== undefined ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. if๋ฌธ์€ ํ† ๋‹ˆ๊ฐ€ Developer์ด๋ฉด ์Šคํ‚ฌ์„ ์ œ๊ณตํ•ด์ค€๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ† ๋‹ˆ๋Š” Person์œผ๋กœ ์ธ์‹ํ•˜์—ฌ age๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค. if๋ฌธ ์ฒซ ์ค„์—๋Š” developer๊ฐ€ ํ† ๋‹ˆ์ด๊ณ , ๋ฐ‘์—์ค„์€ Person์œผ๋กœ์„œ์˜ ํ† ๋‹ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ํ•„์š”ํ•œ ์†์„ฑ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.