#1 Language ๐Ÿ‘„/1-3 Typescript

[Typescript] Typescript ๊ธฐ๋ณธ & ๊ธฐ๋ณธ ํƒ€์ž…

FillByCoding 2023. 12. 23. 14:42

Using Type
  • number
    • JS๋‚˜ TS์—์„œ number ํƒ€์ž…์€ ํ•˜๋‚˜๋ฟ
  • string
    • ‘Hi’, “Hi”,Hi
  • boolean
    • true, false
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐจ์ด
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž…
    • ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•  ๋•Œ ์ฒ˜์Œ์— ์ˆซ์žํ˜• ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋”๋ผ๋„ ์ „ํ˜€ ๋ฌธ์ œ ์—†์Œ
    • ๊ทธ๋ž˜์„œ ํŠน์ • ํƒ€์ž…์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋Ÿฐํƒ€์ž„์—์„œ ํ˜„์žฌ ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”
    • typeof๋ฅผ ์‚ฌ์šฉ
    • ๋ฐ˜๋ฉด, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ž…
    • ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋จผ์ € ์ •์˜ํ•จ
    • ๋Ÿฐํƒ€์ž„ ์ค‘์— ๊ฐ‘์ž๊ธฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
    • ์ˆซ์žํ˜•์œผ๋กœ ์„ค์ •ํ•œ ๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์—๋Ÿฌ๋ฐœ์ƒ
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์Œ
    • ๊ฒฐ๋ก  : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์€ ์ปดํŒŒ์ผ ์ค‘์— ํ™•์ธ๋˜๋Š” ๋ฐ˜๋ฉด,
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์€ ๋Ÿฐํƒ€์ž„ ์ค‘์— ํ™•์ธ ๋จ
    • ์ถ”๊ฐ€: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹นํ• ์ˆ˜๋„ (age: number)
    • ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜๋„ ์žˆ์Œ
object
  • {age: 30}
  • ๊ฐ์ฒด๋Š” ์œ„์™€ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•˜๊ฑฐ๋‚˜, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•จ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋Š” ์‰ผํ‘œ ์‚ฌ์šฉํ•˜์ง€๋งŒ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋Š” ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฌ์šฉ

Array
  • [1, 2, 3]
  • ๋ฐฐ์—ด์—๋Š” ๋ฌธ์ž์—ด๊ณผ ์ˆซ์žํ˜• ํ˜ผํ•ฉ ๊ฐ€๋Šฅ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐฐ์—ด์— ๋ฌด์—‡์ด๋“  ์ง€์ • ๊ฐ€๋Šฅ
  • ์–ด๋–ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด์ด๋“  ์ง€์›ํ•˜๋ฉฐ ๋ฐฐ์—ด์˜ ํƒ€์ž…์„ ์œ ์—ฐํ•˜๊ฒŒ๋„, ์ œํ•œ์ ์œผ๋กœ๋„ ์ง€์ • ๊ฐ€๋Šฅ

  • ๋ฐฐ์—ด์€ ๋Œ€๊ด„ํ˜ธ [ ] ์•ž์— ํƒ€์ž…์„ ๋ถ™์—ฌ์คŒ
  • ํ˜ผํ•ฉ๋œ ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด any ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

Tuple
  • [1, 2]
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํŠœํ”Œ์ด ์—†์—ˆ์Œ
  • ๊ธธ์ด์™€ ํƒ€์ž…์ด ๊ณ ์ •๋œ ๋ฐฐ์—ด
  • ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ํƒ€์ž…์„ ์ง€์ •
role: [number, string]
Enum
  • enum{NEW, OLD}
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์—†๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํƒ€์ž…

  • ๋งˆ์šฐ์Šค ์ปค์„œ ์˜ฌ๋ฆฌ๋ฉด ์ €์žฅ๋œ ์ˆซ์ž๊ฐ€ ํ‘œ์‹œ๋จ
  • ์‹œ์ž‘๊ฐ’ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ํ•„์š”์— ๋”ฐ๋ผ ์ž„์˜์˜ ์ˆซ์ž๋ฅผ ๋ชจ๋“  ์‹๋ณ„์ž์— ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ
  • ํ…์ŠคํŠธ๋„, ํ˜ผํ•ฉ๋„ ํ• ๋‹น ๊ฐ€๋Šฅ
enum Role { ADMIN = 'ADMIN', READ_ONLY = 100, AUTHOR = 200 };
  • ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์ž‡๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋งคํ•‘๋œ ๊ฐ’์ด ์žˆ๋Š” ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ
Any
  • ๊ฐ€์žฅ ์œ ์—ฐํ•œ ํƒ€์ž…
  • ์ด ํƒ€์ž…์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์–ด๋–ค ๊ฒƒ๋„ ์ดํ•ด์‹œํ‚ค์ง€ ์•Š์Œ
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅผ ๋ฐ” ์—†๊ฒŒ ๋จ
  • any ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์œ„์น˜์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฒŒ ๋จ
  • ์–ด๋–ค ๊ฐ’์ด๋‚˜ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ์ €์žฅ๋ ์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜๊ฑฐ๋‚˜
  • ๋Ÿฐํƒ€์ž„ ๋„์ค‘ ํŠน์ • ๊ฐ’์— ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ž‘์—…์˜ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ any๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ
union (์กฐํ•ฉ ํƒ€์ž…)
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ข…๋ฅ˜์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ
  • ํ•จ์ˆ˜๋‚˜ ์ƒ์ˆ˜, ๋ณ€์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์œ ๋‹ˆ์–ธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Œ
function combine(input1: number | string, input2: number | string) {
  let result;
  if (typeof input1 === "number" && typeof input2 === "number") {
    result = input1 + input2;
  } else {
    result = input1.toString() + input2.toString();
  }
  return result;
}
๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…
  • ๋‹จ์ˆœํ•œ ํŠน์ • ๋ณ€์ˆ˜๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹˜
  • ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด๋„ ์•„๋‹ˆ๋ฉฐ ์ •ํ™•ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํƒ€์ž…
function combine(
  input1: number | string,
  input2: number | string,
  resultConversion: "as-number" | "as-text"
) {
  let result;
  if (
    (typeof input1 === "number" && typeof input2 === "number") ||
    resultConversion === "as-number"
  ) {
    result = +input1 + +input2;
  } else {
    result = input1.toString() + input2.toString();
  }
  return result;
  //   if (resultConversion === "as-number") {
  //     return +result; // ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” + ๊ธฐํ˜ธ๋ฅผ ์ž…๋ ฅ
  //   } else {
  //     return result.toString();
  //   }
}

const combinedAges = combine(30, 26, "as-number");
console.log(combinedAges);

const combinedStringAges = combine("30", "26", "as-number");
console.log(combinedStringAges);

const combinedNames = combine("Max", "Anna", "as-text");
console.log(combinedNames);
ํƒ€์ž… ์•Œ๋ฆฌ์–ด์Šค / ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…
  • ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ์ง์ ‘ ์ƒ์„ฑ
  • ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ํƒ€์ž…์—๋„ ๋ณ„์นญ ๋ถ™์ž„
  • ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๊ณ  ํƒ€์ž…์„ ์ค‘์‹ฌ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • ํƒ€์ž… ์„ค์ •์ด ํ•„์š”ํ•œ ์ฝ”๋“œ ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํƒ€์ž… ์•Œ๋ฆฌ์–ด์Šค ์‚ฌ์šฉ ์ „
// ํƒ€์ž… ์•Œ๋ฆฌ์–ด์Šค ์‚ฌ์šฉ์ „

function greet(user: { name: string; age: number }) {
  console.log('Hi, I am ' + user.name);
}
 
function isOlder(user: { name: string; age: number }, checkAge: number) {
  return checkAge > user.age;
}

// ๋‹จ์ˆœํ™” ํ›„

type User = { name: string; age: number };
 
function greet(user: User) {
  console.log('Hi, I am ' + user.name);
}
 
function isOlder(user: User, checkAge: number) {
  return checkAge > user.age;
}
ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ฐ ๋ฌดํšจ
  • ํ•จ์ˆ˜์—๋Š” ํƒ€์ž…๋ณด๋‹ค ์ค‘์š”ํ•œ๊ฒŒ ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ
  • ๋ฐ˜ํ™˜(return) ํƒ€์ž…์ž„
  • ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”๋ก  ํ•จ
  • undefined๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํƒ€์ž…์ž„
  • void๋Š” ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์„๋•Œ ์“ฐ์ด๋Š” ํƒ€์ž…
  • ๋“œ๋ฌผ๊ฒŒ ์“ฐ์ด๋Š” undefined๋Š” ์‹ค์ œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” void๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ
  • void๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ
ํƒ€์ž…์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜
  • ํ•จ์ˆ˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…์ž„
  • ํ•จ์ˆ˜ ํƒ€์ž…์€ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ •์˜
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ ๋งŒ๋“ค์–ด ์ง
let combineValues: (a: number, b: number) => number;
ํ•จ์ˆ˜ ํƒ€์ž… ๋ฐ ์ฝœ๋ฐฑ
  • ์ฝœ๋ฐฑ๊ณผ ํ•จ์ˆ˜ ํƒ€์ž…์€ ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ ํ•จ
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ
function sendRequest(data: string, cb: (response: any) => void) {
  // ... sending a request with "data"
  return cb({data: 'Hi there!'});
}
 
sendRequest('Send this!', (response) => { 
  console.log(response);
  return true;
 });
์•Œ ์ˆ˜ ์—†๋Š” ํƒ€์ž… unknown
let userInput: unknown;
let userName: string;

userInput = 5;
userInput = "yum";

if (typeof userInput === "string") {
  userName = userInput;
}
์ ˆ๋Œ€ ํƒ€์ž… never
  • ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” void์™€ ๋‹ฌ๋ฆฌ
  • never๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…
  • never๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ฐ˜ํ™˜๊ฐ’์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ
// ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋„˜๊ธฐ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜

function generateError(message: string, code: number):never {
  throw { message: message, errorCode: code };
}

generateError("An error occurred!", 500);
  • never๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด void๊ฐ€ ์ถ”๋ก  ๋จ
  • never๊ฐ€ ์ƒˆ๋กœ์šด ์œ ํ˜•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ
  • ์ด ํ•จ์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ถ€๋ฅผ ์ถฉ๋Œ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์Œ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ ์ˆ˜ ์žˆ์Œ
LIST