Language/TypeScript

[ Typescript ] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ma.caron_g 2025. 2. 24. 18:10

kyounghwan๋‹˜์˜ GitHub.io

 

Guide | ๊ธฐ์–ต๋ณด๋‹ค ๊ธฐ๋ก์„

Guide ๋ณธ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” vue.js ์— TypeScript(TS)๋ฅผ ์ ์šฉํ•˜์ž๋Š” ์ƒ๊ฐ์œผ๋กœ TS๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ๊ธฐ๋กํ•œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ค€๋น„ vue create๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  vue.js ์ฝ”๋“œ ์œ„์— ts

kyounghwan01.github.io

 

 

โš ๏ธ any ํƒ€์ž…์€ ์–ด๋– ํ•œ ๊ฐ’๋“ค์ด๋“  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธ๋˜๋Š”๋ฐ, any๋ฅผ ์ค‘๊ตฌ๋‚œ๋ฐฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, VanillaJS์™€ ๋‹ค๋ฅธ ์ ์ด ์—†์œผ๋ฏ€๋กœ any ํƒ€์ž…์˜ ์„ ์–ธ์€ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ธธ๋“ค์ด์ž.

 

์ž‘์„ฑ์ž๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ type์„ ์œ„์ฃผ๋กœ ์“ด๋‹ค.

๊ทธ ์ด์œ ๋Š”,

interface ์ •์˜ ํ›„ ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜์—ฌ ํ™•์ธํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํƒ€์ž… ์ข…๋ฅ˜๋ฅผ ๋ฐ”๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์—†๋Š” ๋ฐ˜๋ฉด,

 

 

type ์ •์˜ ํ›„, ๋งˆ์šฐ์Šค ํ˜ธ๋ฒ„ ์‹œ ํƒ€์ž…์„ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๐Ÿค” ํƒ€์ž… ์ถ”๋ก 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜, ๊ฐ’์„ ํ• ๋‹น ํ•  ๋•Œ ์ถ”๋ก ์ด ์ผ์–ด๋‚œ๋‹ค.

const a = 1;

์‚ฌ๋žŒ์ด ๋ณด์•˜์„ ๋•Œ, "a์—๋Š” ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ณ€์ˆ˜๊ตฌ๋‚˜~" ํ•˜๋Š” ๊ฑฐ ์ฒ˜๋Ÿผ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” a๋ฅผ number ํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์„ ์ถ”๋ก ํ•œ๋‹ค.

 

ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์ถ”๋ก ์ด ์ผ์–ด๋‚œ๋‹ค.

const fx = (a=10) => {
  return a;
}

ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’์„ ์„ ์–ธํ•จ์œผ๋กœ a๋Š” number๋ผ๋Š” ์ถ”๋ก ์ด ์ผ์–ด๋‚œ๋‹ค.

 

๐Ÿค” ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๋ก 

interface User<T> {
  name: string;
  age: number;
  address: T;
}

interface UserIdentityCard<K> extends User<K> {
  id: K
  // ์œ„์— User<T> ํƒ€์ž…์„ ๊ทธ๋Œ€๋กœ ์ ์šฉ
  // name: string;
  // age: number;
  // address: K
} 

const ํ™๊ธธ๋™: User<string> = {
  name: "ํ™๊ธธ๋™",
  age: 29,
  address: "Chosun"
}

const ํ™๊ธธ๋™๋ฏผ์ฆ: UserIdentityCard<string> = {
  id: "139200-191000",
  name: "ํ™๊ธธ๋™",
  age: 29,
  address: "Chosun"
}

์ œ๋„ค๋ฆญ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ž…๋ ฅ๋œ string ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค.

 

๐Ÿค” Best Common Type ์ถ”๋ก 

๋ฐฐ์—ด ์•ˆ์— ์—ฌ๋Ÿฌ ํƒ€์ž…์ด ์ •์˜๋œ ๊ฒฝ์šฐ ์ถ”๋ก ์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ๋‹ค.

const arr = [1, true, "a"];

ํ•ด๋‹น arr๋Š” Array<number | boolean | string> ํ˜น์€ (number | boolean | string)[] ์œผ๋กœ ์ถ”๋ก ๋œ๋‹ค.

 

์ถ”๋ก ์€ ์ž‘์€ ๋ณ€์ˆ˜์— ๊ฐœ๋ฐœ์ž๊ฐ€ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ค€๋‹ค.

 

๐Ÿ–๐Ÿป ํƒ€์ž… ๋‹จ์–ธ (Type Assertion)

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ถ”๋ก ํ•˜๋Š” ๊ฐ’๋ณด๋‹ค ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๋” ์ž˜ ์•Œ๊ณ ์žˆ์„ ๋•Œ ๋ณ€์ˆ˜์— ์›ํ•˜๋Š” ํƒ€์ž…์„ ๊ฐ•์ œ๋กœ ๋ถ€์—ฌํ•œ๋‹ค.

 

let a;
a = "Hello, World!"
a = 10;
let b = a;
// ์ด๋•Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” a๊ฐ€ ์–ด๋– ํ•œ ๊ฐ’์ด ๋‹ด๊ธธ ๋ณ€์ˆ˜์ธ์ง€ ์ •ํ™•ํžˆ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜์—ฌ any๋กœ ์ถ”๋ก ํ•œ๋‹ค.
// ์ฆ‰ b๋„ any ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ.
// ์šฐ๋ฆฌ๋Š” b์— number์ž„์„ ์•Œ๊ธฐ์— number๋ฅผ ๊ฐ•์ œ๋กœ Assertionํ•œ๋‹ค.
b = a as number;

as <T> ๋ฅผ ํ†ตํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์ด numberํƒ€์ž…์ž„์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

๊ฐ„ํ˜น ๊ฐœ๋ฐœํ•˜๋‹ค ์ถ”๋ก ์— ์‹คํŒจํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ as <T> ๋ฅผ ํ†ตํ•˜์—ฌ ๋ฆฐํŒ… ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

DOM์— ์ ‘๊ทผํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

import { useEffect } from 'react'

function Home() {
  
  useEffect(() => {
    // ๋งˆ์šดํŠธ๋œ DOM์ด ์•„๋‹ˆ๋ผ๋ฉด useEffect๋ฅผ ํ†ตํ•ด ๋งˆ์šดํŠธ ๋œ ๋‹ค์Œ DOM์„ ์ฐพ์•„์ฃผ์ž
    
    // โš ๏ธ Type1. id๊ฐ’์œผ๋กœ ์ฐพ์€ Element๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜ค๋ฅ˜
    const box = document.getElementybyId("box");
    box.innerText = "content"; // error: Object is possible null;
   
    // โœ… Type2. ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•˜์—ฌ Element๊ฐ€ ์กด์žฌํ•  ๋•Œ ์ž‘์—…
    const box = document.getElementybyId("box");
    if(box) {
      box.innerText = "content";
    }
   
    // โœ… Type3. box๊ฐ€ ๋งˆ์šดํŠธ ๋œ ํ›„, ๋ฌด์กฐ๊ฑด ์กด์žฌํ•œ๋‹ค๋Š” ์ƒํ™ฉ์ž„์„ ์•Œ๋ฆผ
    const box = document.getElementybyId("box") as HTMLDivElement;
    box.innerText = "content";
   
  }, [])

  return <div id="box"></div>
}

 

๐Ÿ›ก๏ธ ํƒ€์ž… ๊ฐ€๋“œ (Type Guard)

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ํƒ€์ž…์ด 2๊ฐœ ์ด์ƒ์ž„์œผ๋กœ ๊ณตํ†ต๋˜๋Š” ์†์„ฑ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

type NPC = {
  name: string;
  gender: "M" | "F";
  
}

type User = {
  name: string;
  gender: "M" | "F";
  skill: string[];
}

function getInstance(): NPC | User {
  return { name: "๊ฐœ๋ฐœ์ž", gender: "M", skill: ['ctrl-C', 'ctrl-V'] };
}


const dev = getInstacne(); // NPC |  User์˜ ๊ณตํ†ต๋œ ์†์„ฑ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. (or ์—ฐ์‚ฐ์ž)
// dev ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด .์„ ์ฐ์œผ๋ฉด
// intellgence ๊ณตํ†ต์ธ name๊ณผ gender๋งŒ ํ‘œ์‹œ.

// skill์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, Assertion์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
if ((dev as User).skill) {
  console.log((dev as User).skill);
} else {
  console.log('์–˜ NPC๋„ค');
}

// ํƒ€์ž… ๊ฐ€๋“œ ์ •์˜
function getInstanceWithGuard(target: NPC | User): target is User {
  return (target as User).skill !== undefined
}

if(getInstanceWithGuard(dev)) {
  console.log(dev.skill)
} else {
  console.log('์–˜ NPC๋ผ๊ณ ');
}

 


๐ŸŽญ ๊ธฐ๋ณธ ํƒ€์ž…

โญ•โŒ boolean

const bool: boolean = true; // true or false

 

๐Ÿ”ข number

// ์ •์ˆ˜, ์‹ค์ˆ˜ ๋ชจ๋‘ number๋กœ ํ‘œ๊ธฐ
const naturalNumber: number = 100;
const integer = 0.123;

 

 

๐Ÿ‘ป null / undefined

const a: null = null;
const b: undefined = undefined;

 


โ˜ ๏ธ Object

// ํ•„์ˆ˜
const required: { name: string; age: number } = { name: 'dev', age: 29 };

// ํ•„์ˆ˜ ์†์„ฑ์ด์ง€๋งŒ ๋ฐ”๋กœ ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ
const required = {} as { name: string; age:number };

// ์„ ํƒ
const optional: {name: string; age?: number } = { name: 'dev' };

// (Partial) ํ•„์ˆ˜ ์†์„ฑ์œผ๋กœ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ํƒ ์†์„ฑ์œผ๋กœ
const partial: Partial<{name: string; age: number }> = {};

// ์ฝ๊ธฐ ์ „์šฉ ReadOnly
// readonly.name = "junior" ๋กœ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€
const readonly: {readOnly name: string} = { name: 'dev' };

// Empty Object ํƒ€์ž…
const emptyObject: Recored<string, never> = {};

 

๐Ÿš‚ Array

// string ํƒ€์ž…๋งŒ ๋ฐ›๋Š” ๋ฐฐ์—ด
const onlyString: string[] = ["a", "b"];
const onlyArrayString: Array<string> = ["a", "b"];

// number ํƒ€์ž…๋งŒ ๋ฐ›๋Š” ๋ฐฐ์—ด
const onlyNumber: number[] = [1, 2];
const onlyArrayNumber: Array<number> = [1, 2];

 

๐Ÿš‚ Tuble

๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜๊ณ , ๊ฐ ์š”์†Œ์˜ ํƒ€์ž…์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด ํ˜•์‹์ด๋‹ค.

const tuple: [string, number] = ["str", 10];

 

๐ŸŽŽ Enum

์ƒ์ˆ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ, HTML์˜ option ํƒœ๊ทธ ๊ฐ™์ด ์–ด๋– ํ•œ ์ข…๋ฅ˜์— ๋Œ€ํ•œ ์ง€์ •๋œ ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ํ‹€๋ฆฐ ์ƒ์ˆ˜ ๊ฐ’์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•˜์—ฌ Enum์œผ๋กœ ์ƒ์ˆ˜์˜ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์ด์™ธ์˜ ๊ฐ’์€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

enum ColorPalette {
  Red: "red",
  Green: "green",
  Blue: "blue"
}

const color: ColorPalette = ColorPlatte.Red;

 

๐Ÿคท๐Ÿป‍โ™‚๏ธ any

๋ง ๊ทธ๋Œ€๋กœ ์–ด๋– ํ•œ ํƒ€์ž…์ด๋“  ํ—ˆ์šฉํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋œ ํŒŒ์ผ์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ”๊ฟ€ ๊ฒจ์šฐ ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ •์  ํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ธฐ์— ์ฒœ์ฒœํžˆ ํƒ€์ž…์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋‹จ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— any๋ฅผ ์ ์šฉ ํ›„, ์ ์ง„์ ์œผ๋กœ ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ์ ์šฉ.

โš ๏ธํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

const anyType: any = ["any", "body~", 123, true];

 

๐Ÿ‘ป void

๋ณ€์ˆ˜์—๋Š” undefined, null๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๊ณ , ํ•จ์ˆ˜์—๋Š” return ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์„ค์ •ํ•˜๋Š” ํƒ€์ž…์ด๋‹ค.

const unuseData: void = undefined;

const notReturnValue(): void {
  console.log('๋ฐ˜ํ™˜ ์—†์Œ');
}

 

๐Ÿ” never

ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋งจ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํƒ€์ž…์œผ๋กœ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฐ’์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

์ฃผ๋กœ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋˜๋Š” ๋Œ€์ฒด ๋ถˆ๊ฐ€ํ•œ ๊ฐ’์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. -> ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

// ์ด ํ•จ์ˆ˜๋Š” ์ ˆ๋Œ€ ํ•จ์ˆ˜์˜ ๋๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ
const nerverEnd = (): never => {
  while(true) {
    ...
  }
  // ๋„๋‹ฌํ•˜์ง€ ์•Š์Œ
}

const errorThrow = (): never => {
  // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  throw ํ•จ์ˆ˜ ์‹คํ–‰
  throw new Error("error");
}

 

๐Ÿ›— Union

union ํƒ€์ž…์€ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ " | " ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

let unionType: string | number = "str";
unionType = 123;
unionType = "word";
unionType = true; // error

 

๐Ÿ›— Union ์ธํ„ฐ์…‰์…˜

" | "๊ฐ€ OR ์ด๋ผ๋ฉด " & "๋Š” AND ์ด๋‹ค.

type User = {
  name: string
  age: number
  gender: 'male' | 'female'
}

type Robot = {
  name: string;
  age: number;
}

const printCommon = (someone: User | Robot) =>{
    console.log(someone.name);
    // ๊ณตํ†ต์œผ๋กœ ์ •์˜๋œ ๋‚ด์šฉ๋งŒ ํ—ˆ์šฉ
}

const printDiff = (someone: User & Robot) =>{
  console.log(someone.gender)
  // ๋‘ ํƒ€์ž…์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ํ—ˆ์šฉ
}

 

๐Ÿ›ก๏ธ union Type Guard

์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•  ๋•Œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ ๊ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

type functionProps = {
  value: string | number;
}

function fx(value: functionProps): number {
  if(typeof value === 'string') {
    return value.length;
  }
  return value;
}

 

๐Ÿ“ข declare

์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๐Ÿ“„*.d.ts ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

import ํ•  ํ•„์š” ์—†์ด, typescript ํ”„๋กœ์ ํŠธ์—๊ฒŒ ์ด๋Ÿฌํ•œ ํƒ€์ž…์ด ์žˆ๋‹ค๊ณ  ๋ฏธ๋ฆฌ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ง€๋„๋งต์„ ๊ทธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์˜€์„ ๋•Œ,

 

๐Ÿ“„type.d.ts

declare function setupMap(config: MapConfig): void;

interface MapConfig {
  lng: number;
  lat: number;
  tileSize: 8 | 16 | 32;
}

 

๐Ÿ“„App.tsx

// prev code...

// import ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
setupMap({
  lng: 10,
  lat: 10,
  tileSize: 8
})

// next code ...

 


 

๐Ÿญ class protected ๋ณ€์ˆ˜

protected๋กœ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋ฅผ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด private ์ง€์ •์ž์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค.

//private
class User {
  #name: string;
  //private name: string;

  constructor(name: string) {
    this.#name = name;
  }
  
  getName() {
    return this.#name
  }
}

class Employee extedns User {
  private department: string;
  
  constructor(name: string, department: string) {
    super(name);
    this.department = department;
  }
  
  public intoduce() {
    //โŒ Error. ํŒŒ์ƒ๋œ class์—์„œ๋„ private๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€
    return `Hello, My name is ${this.name} and I work in ${this.department}.`;
  }
}

const user = new Employee('dev', 'computer');
โœ… user.getName();
โœ… user.introduce();
โŒ user.#name

//protected
class User {
  protected name: string;

  constructor(name: string) {
    this.#name = name;
  }
  
  getName() {
    return this.#name
  }
}

class Employee extedns User {
  private department: string;
  
  constructor(name: string, department: string) {
    super(name);
    this.department = department;
  }
  
  public intoduce() {
    //โœ… protected๋Š” ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    return `Hello, My name is ${this.name} and I work in ${this.department}.`;
  }
}

const user = new Employee('dev', 'computer');
โœ… user.getName();
โœ… user.introduce();
โœ… user.name