[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ]TypeScript - 1

JiEunยท2023๋…„ 5์›” 30์ผ
0
post-thumbnail

โœ”๏ธ ์‹œ์ž‘

TypeScript ํ™˜๊ฒฝ ๊ตฌ์„ฑ, ํƒ€์ž…, ํ•จ์ˆ˜, ์—ฐ์‚ฐ์ž ํ™œ์šฉ ํƒ€์ž…์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค.


๐Ÿ“ ์•Œ๊ฒŒ ๋œ ๊ฒƒ

โœ”๏ธ TypeScript

  • ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ์—์„œ ๊ฐœ๋ฐœํ•œ JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ(Superset)์–ธ์–ด์ด๋‹ค.
  • JavaScript์— ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๊ฐœ๋ฐœ๋œ ์–ธ์–ด์ด๋‹ค.

JavaScript๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ์ƒ๊ธด ๋‹จ์ (ํƒ€์ž…์˜ ๋ช…์‹œ์„ฑ์ด ๋ถ€์กฑํ•œ ๋‹จ์ ์œผ๋กœ ์ธํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค.)์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค.

์žฅ์ 

  • ์ •์ ํƒ€์ž… ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์ตœ์†Œํ™”
  • ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ๊ฐ„ ๋‹จ์ถ•
  • ํ˜‘์—…์‹œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์„ ์ˆ˜ ์žˆ๋‹ค.
  • ES6 ๋ฌธ๋ฒ• ํฌํ•จํ•œ ์ตœ์‹  JavaScript ๋ฌธ๋ฒ• ์ง€์›
  • ์ธํ„ฐํŽ˜์ด์Šค(interface), ์ œ๋„ค๋ฆญ(Generic), ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorators) ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

โœ”๏ธ TypeScript ์„ค์น˜

  1. ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ์„ค์น˜
npm install typescript --save-dev
  1. tsconfig.json ํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ ํ•ด๋‹น ์ฝ”๋“œ ๋ถ™์—ฌ ๋„ฃ๊ธฐ
//tsconfig.json
//compilerOptions ๋‚ด์˜ ์†์„ฑ์€ ์ปค์Šคํ…€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
{
  "compilerOptions": {
    "target": "es6", // ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./dist"
  },
  "include": [
    "src/**/*"
  ]
}
  1. ํŒŒ์ผ ํ™•์žฅ์ž๋Š” ts๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

โœ”๏ธ TypeScript์˜ ํƒ€์ž…

Boolean(๋ถˆ๋ฆฌ์–ธ) ํƒ€์ž…

  • JavaScript์™€ ๋™์ผํ•˜๊ฒŒ ์ฐธ(true), ๊ฑฐ์ง“(false)๊ฐ’์ด๋‹ค.
let isShow: boolean = true;
let isDone: boolean = false;

Number(์ˆซ์ž) ํƒ€์ž…

  • ์ •์ˆ˜์™€ ์‹ค์ˆ˜ ๊ตฌ๋ถ„์—†์ด Number ํƒ€์ž… ํ•˜๋‚˜๋กœ ํ‘œ๊ธฐ(TypeScript๋Š” bigint๋ฅผ ์ง€์›ํ•œ๋‹ค.)
let number1: number = 5;
let number2: number = 0.7;

String(๋ฌธ์ž์—ด) ํƒ€์ž…

  • ํฐ๋”ฐ์˜ดํ‘œ("), ์ž‘์€ ๋”ฐ์˜ดํ‘œ('), ๋ฐฑํ‹ฑ(`)๋กœ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•œ๋‹ค.
let firstName: string = "jieun";
let lastName: string = 'choi';
let longString: string = `ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋‘˜ ์ค„
์ด์ƒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.`

Array(๋ฐฐ์—ด) ํƒ€์ž…

  • ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐ์—ด ํƒ€์ž…์„ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.
  • ํƒ€์ž…์„ ํ˜ผ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.
//์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ• : ์š”์†Œ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž… ๋’ค์— [] ์ž‘์„ฑ
let items: string[] = ["apple", "banana", "grape"];

//๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ• : Araay<์š”์†Œ ํƒ€์ž…> ์ œ๋„ค๋ฆญ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ
let numberList: Array<number> = [4, 7, 100];

Tuple(ํŠœํ”Œ) ํƒ€์ž…

  • ํŠœํ”Œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์š”์†Œ์˜ ํƒ€์ž…๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
let user: [string, number, boolean] = ["choijieun", 20, true];

//user[2]๋Š” boolean์œผ๋กœ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
console.log(user[2].toString());

Object(๊ฐ์ฒด) ํƒ€์ž…

  • ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ํƒ€์ž…์ด๋‹ค.
  • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๋“ค์ด any๋กœ ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ํ”„๋กœํผํ‹ฐ๋ผ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    (but, ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.)
let obj: object = {};

//๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๋“ค์„ ๊ฐ๊ธฐ ๋ช…์‹œํ•ด ์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค
// key-value์— ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…๊นŒ์ง€๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
let user: {name: string, age: number} = {
	name: "choijieun",
	age: 20
}

Any ํƒ€์ž…

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์œ ์ €๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํƒ€์ž…์ผ ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ ์ž ํ•  ๋•Œ any ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ€์ˆ˜์— ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž…์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.
let obj: object = {};

//์—๋Ÿฌ
obj = "hello";

let maybe: any = 4;

//์ •์ƒ
maybe = true;
  • ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ์— ์‹ค์ œ ํ• ๋‹น๋œ ๊ฐ’์ด ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. (์‹ค์ œ ํ• ๋‹น๋œ ๊ฐ’์ด ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ undefined์ด๋‹ค.)
let maybe: any = 4;

//undefined๋กœ ์ถœ๋ ฅ
console.log(maybe.length);
  • ํƒ€์ž…์˜ ์ผ๋ถ€๋งŒ ์•Œ๊ณ , ์ „์ฒด๋Š” ์•Œ์ง€ ๋ชปํ•  ๋•Œ ์œ ์šฉ (ex - ์—ฌ๋Ÿฌ ํƒ€์ž…์ด ์„ž์ธ ๋ฐฐ์—ด์„ ๋ฐ›๊ณ ์ž ํ•  ๋•Œ)
let list: any[] = [1, true, "free"];

//any๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ธฐ์— index ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ boolean ํƒ€์ž…์ด์ง€๋งŒ number ํƒ€์ž…์œผ๋กœ ์žฌํ• ๋‹น ๊ฐ€๋Šฅ 
list[1] = 100;

โœ”๏ธ TypeScript์˜ ํ•จ์ˆ˜

  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค. (ํƒ€์ž… ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ํ•„์ˆ˜)
//named function
function add(x: number, y: number):number {
	return x + y;
}

//arrow function
let add = (x: number, y: number): number => {
	return x + y;
}
  • ํ•จ์ˆ˜์— ๋ฆฌํ„ด๊ฐ’์ด ์—†๋‹ค๋ฉด, void๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ(ํƒ€์ž… ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ํ•„์ˆ˜)
let printAnswer = (): void => {
	console.log("Hi");
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜์— ๋งž์ถฐ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.
let greeting = (firstName: string, lastName: string): string => {
	return `hello, ${firstName} ${lastName}`;
}

//์—๋Ÿฌ
greeting('jieun');

//์ •์ƒ
greeting('jieun', 'choi');

//๋„ˆ๋ฌด ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด ์—๋Ÿฌ
greeting('jieun', 'choi', 'Hi');
  • ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, undefined๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ ํ• ๋‹น๋  ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ •ํ•ด๋†“์„ ์ˆ˜๋„ ์žˆ๋‹ค.(default parameter์™€ ๊ฐ™์€ ๋™์ž‘)
let greeting = (firstName: string, lastName="choi"): string => {
	return `hello, ${firstName} ${lastName}`;
}

//์ •์ƒ
//๋’ค์˜ ์ธ์ž๋กœ undefined๋ฅผ ๋ณด๋‚ด๋„ ๊ฐ’์€ โ€œhello, jieun choiโ€์œผ๋กœ ๋ฐ˜ํ™˜
greeting('jieun', undefined);
  • ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„ ๋์— ?๋ฅผ ๋ถ™์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
let greeting = (firstName: string, lastName?: string): string => {
	return `hello, ${firstName} ${lastName}`;
}

//์ •์ƒ
//์ „๋‹ฌ์ธ์ž๋ฅผ ํ•˜๋‚˜๋งŒ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋’ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” undefined๋กœ ๋ฐ˜ํ™˜
greeting('jieun');

TypeScript์˜ ์—ฐ์‚ฐ์ž ํ™œ์šฉ ํƒ€์ž…

์œ ๋‹ˆ์˜จ(Union) ํƒ€์ž…

  • ๋‘˜ ์ด์ƒ์˜ ํƒ€์ž…์„ ํ•ฉ์ณ์„œ ๋งŒ๋“ค์–ด์ง„ ์ƒˆ๋กœ์šด ํƒ€์ž…
  • | ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉ (JavaScript์—์„œ ||์™€ ๋™์ผํ•˜๋‹ค.)
  • ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค.
function printValue(value: number|string): void {
  if (typeof value === "number") {
    console.log(`number: ${value}`);
  } else {
    console.log(`string: ${value}`);
  }
}

์žฅ์ 

  • ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์— ๊ด€๋ จ๋œ API๋ฅผ ์‰ฝ๊ฒŒ ์ž๋™์™„์„ฑ์œผ๋กœ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
    ex - let value: string | number | boolean
    ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

์œ ์˜์‚ฌํ•ญ

  • ์œ ๋‹ˆ์˜จ์— ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž…์— ๊ณตํ†ต์ธ ๋ฉค๋ฒ„๋“ค์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ํ•ด์•ผํ•œ๋‹ค.
interface Developer {
  name: string;
  skill: string;
}

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

//askSomenone ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” Developer, Person์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ์ธ name์—๋งŒ ์ ‘๊ทผ
// ๊ณตํ†ต๋˜๊ณ  ๋ณด์žฅ๋œ ํ”„๋กœํผํ‹ฐ๋งŒ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
// ๋งŒ์•ฝ ๋‚˜๋จธ์ง€ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉ
function askSomeone(someone: Developer | Person) {
	console.log(someone.name);
}

ํƒ€์ž… ๊ฐ€๋“œ(Type Guard)?

  • TypeScript์—์„œ ํƒ€์ž…์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜
  • ํƒ€์ž… ๊ฐ€๋“œ๋Š” ํŠน์ • ์ฝ”๋“œ ๋ธ”๋ก์—์„œ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ด ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์—์„œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅ
  • in ์—ฐ์‚ฐ์ž : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ์—ฐ์‚ฐ์ž
function askSomeone(someone: Developer | Person) {
  // in ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์†์„ฑ์ด ๊ฐ์ฒด ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌ
  if ('skill' in someone) {
    console.log(someone.skill);
  }
  if ('age' in someone) {
    console.log(someone.age);
  }
}

in ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ์ฒด ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

์ธํ„ฐ์„น์…˜(Intersection) ํƒ€์ž…

  • ๋‘˜ ์ด์ƒ์˜ ํƒ€์ž…์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • & ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ
//value ๋ณ€์ˆ˜๋Š” string, number, boolean ํƒ€์ž…์„ ์ „๋ถ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
let value: string & number & boolean;
  • ํ•˜๋‚˜์˜ ๋‹จ์ผ ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž… ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
interface Developer {
  name: string;
  skill: string;
}

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

//askSomeone ํ•จ์ˆ˜ ๋‚ด์—์„  ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ์— ์ „๋ถ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
function askSomeone(someone: Developer & Person) {
  console.log(someone.age);
	console.log(someone.name);
	console.log(someone.skill);
}
  • ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์€ ํƒ€์ž… ๊ฐ€๋“œ๋Š” ํ•„์š” ์—†๋Š” ๋ฐ˜๋ฉด Developer์™€ Person์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ํ•ฉ์ง‘ํ•ฉ์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ์—, ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ „๋ถ€ ๋ณด๋‚ด์ค˜์•ผํ•œ๋‹ค.
  • ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
interface Developer {
  name: string;
  skill: string;
}

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

//์œ ๋‹ˆ์˜จ ํƒ€์ž…
function askSomeone(someone: Developer | Person) {
	//ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  if ('skill' in someone) {
    console.log(someone.skill);
  }

  if ('age' in someone) {
    console.log(someone.age);
  }
}

//์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์ƒ๊ธด๋‹ค.
askSomeone({name: '์ตœ์ง€์€', skill: 'ํ”„๋ก ํŠธ์—”๋“œ'});
askSomeone({name: '์ตœ์ง€์€', age: 20});

//์ธํ„ฐ์„น์…˜ ํƒ€์ž…
function askSomeone2(someone: Developer & Person) {
	//ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
	console.log(someone.age);
	console.log(someone.name);
	console.log(someone.skill);
}

//์ธํ„ฐ์„น์…˜ ํƒ€์ž…์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์—†๋‹ค.
askSomeone2({name: '์ตœ์ง€์€', skill: 'ํ”„๋ก ํŠธ์—”๋“œ', age:20});

โœ๏ธ ๋งˆ์น˜๋ฉฐ

ํƒ€์ž…, ํ•จ์ˆ˜๋Š” ์ดํ•ด๊ธฐ ์‰ฌ์› ๋Š”๋ฐ
์—ฐ์‚ฐ์ž ํ™œ์šฉ ํƒ€์ž…์—์„œ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค.

์–ด๋– ํ•œ ๋ชฉ์ ? ์ธ์ง€๋Š” ์•Œ๊ฒ ์œผ๋‚˜ ์ด๊ฒƒ์„ ์‹ค์Šตํ•ด์„œ ํ’€์–ด๋ณด๋ ค๊ณ  ํ•˜๋‹ˆ ์ƒ๊ฐ ๋ณด๋‹ค ์ž˜ ๋˜์ง€ ์•Š์•˜๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์˜ ๋ช…์‹œ์„ฑ์ด ๋ถ€์กฑํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•œ ๊ฒƒ์œผ๋กœ ์•„๋งˆ ํ”„๋กœ์ ํŠธ ์ž‘์—…์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์‹œ๊ฐ„ ๋  ๋•Œ ๋งˆ๋‹ค ํ‹ˆํ‹ˆํžˆ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

0๊ฐœ์˜ ๋Œ“๊ธ€