Node.js & TypeScript

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋…๊ณผ ์‹ค๋ฌด์— ์œ ์šฉํ•œ Type Narrowing ๊ธฐ๋ฒ•

martinooo 2024. 7. 11. 15:52

 

 

 

 

๐Ÿคท‍โ™‚๏ธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ž€?


์š”์ฆ˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(typescript)๋Š” ๊ตญ๋ฃฐ์ฒ˜๋Ÿผ ํ”„๋ŸฐํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์ € ๋˜ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™œ์šฉํ•˜๋ฉฐ ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ  ์ข‹์€์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋ณธ๋ก ์œผ๋กœ ๊ฐ€์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” Microsoft์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šˆํผ์…‹์œผ๋กœ ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์œ„ ํ™•์žฅ์ž๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ํ™œ์šฉํ•˜๋ฉฐ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


[TypeScript] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์ •์˜ ๊ณต๋ถ€ํ•˜๊ธฐ

https://cometruedream.tistory.com/125

 

[TypeScript] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์ •์˜

๐Ÿคณ TypeScript ๊ธฐ๋ณธ ํƒ€์ž… ์ •๋ฆฌ ๋ฌธ์ž์—ด ํƒ€์ž…์„ ์ •์˜ ํ•˜๋Š” ๋ฐฉ๋ฒ• //string ํƒ€์ž… ์ •์˜ let name: string = 'YOO'; ์ˆซ์ž์— ํƒ€์ž…์„ ์ •์˜ ํ•˜๋Š” ๋ฐฉ๋ฒ• //number ํƒ€์ž… ์ •์˜ let age:number = 30; Boolean true/false ํƒ€์ž…์„ ์ •์˜ //boolen

cometruedream.tistory.com

 

๐Ÿคท‍โ™‚๏ธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?


1. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

Typescript๋Š” ์ฝ”๋“œ์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์˜๋„์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์ œ

function add(a: number, b: number): number {
  return a + b;
}

const result = add(2, 3); //ํƒ€์ž…์ถ”๋ก ์œผ๋กœ result ์ž๋™์œผ๋กœ number ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

2. ์ปดํŒŒ์ผ ์‹œ์ ์˜ ์˜ค๋ฅ˜ ๊ฒ€์ถœ

Typescript๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์ œ

function greet(name: string) {
  return `Hello, ${name}`;
}

greet(42); //์ปดํŒŒ์ผ ์˜ค๋ฅ˜ greet ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ ์ธ์ž๊ฐ’์„ ๋ฐ›์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

3. ์ƒ์‚ฐ์„ฑ๊ณผ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๋„๊ตฌ ์ง€์›

Typescript๋Š” ์ฝ”๋“œ์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์˜๋„์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿคท‍โ™‚๏ธ ํƒ€์ž… ๋‚ด ๋กœ์ž‰(Type Narrowing)๋ž€?


ํƒ€์ž… ๋‚ด๋กœ์ž‰์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜๊ฐ€ ํŠน์ • ํƒ€์ž…์ž„์„ ์ •ํ™•ํ•˜๊ณ  ํ™•์‹คํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‹ค๋ฌด์—์„œ ํƒ€์ž…์ •์˜๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ํŠน์ • ํƒ€์ž…์œผ๋กœ ์ขํžˆ๋ฉด์„œ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

 

ํƒ€์ž…๋‚ด๋กœ์ž‰ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ’ก" ํƒ€์ž…์˜ ๋ฒ”์˜๋ฅผ ์ขํžˆ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ์•ˆ์ „ํ•˜๋‹ค"

 

ํƒ€์ž… ๋‚ด ๋กœ์ž‰(type narrowing) ์˜ˆ์ œ

typeof ๊ตฌ๋ถ„ ์˜ˆ์ œ

function printValue(value: number | string) {
  if (typeof value === 'number') {
    console.log(`์ˆซ์ž ๊ฐ’: ${value}`);
  } else {
    console.log(`๋ฌธ์ž์—ด ๊ฐ’: ${value}`);
  }
}

printValue(42); // ์ˆซ์ž ๊ฐ’: 42
printValue("Hello"); // ๋ฌธ์ž์—ด ๊ฐ’: Hello

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ printValue ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆซ์ž์™€ ๋ฌธ์ž์—ด์˜ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  typeof ํ™œ์šฉํ•ด์„œ ๊ฐ’์ด ์ˆซ์ž์ธ์ง€ ๋ฌธ์ž์—ด์ธ์ง€ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

null ์ฒดํฌ ๊ตฌ๋ถ„ ์˜ˆ์ œ

function greet(name: string | null) {
  if (!name) {
    console.log("์ด๋ฆ„์ด ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.");
  } else {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${name}!`);
  }
}

greet("Alice"); // ์•ˆ๋…•ํ•˜์„ธ์š”, Alice!
greet(null); // ์ด๋ฆ„์ด ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ greet ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž์—ด๊ณผ null์˜ ํƒ€์ž…์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๊ณ  ์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉํ•ด์„œ ๊ฐ’์ด ๋ฌธ์ž์—ด์ธ์ง€ null์ธ์ง€ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ฐฐ์—ด ํƒ€์ž… ๊ตฌ๋ถ„ ์˜ˆ์ œ

function processItems(items: number[] | string[]) {
  if (items.length === 0) {
    console.log("๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.");
    return;
  }

  if (typeof items[0] === 'number') {
    console.log(`์ˆซ์ž ๋ฐฐ์—ด: ${items}`);
  } else {
    console.log(`๋ฌธ์ž์—ด ๋ฐฐ์—ด: ${items}`);
  }
}

processItems([1, 2, 3]); // ์ˆซ์ž ๋ฐฐ์—ด: 1,2,3
processItems(["a", "b", "c"]); // ๋ฌธ์ž์—ด ๋ฐฐ์—ด: a,b,c

 

์œ„์— ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์— ์š”์†Œ๊ฐ€ ์ˆซ์ž์ธ์ง€ ๋ฌธ์ž์—ด์ธ์ง€ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ขํž์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๐Ÿคท‍โ™‚๏ธ ๋งˆ์ง€๋ง‰์œผ๋กœ


์‹ค๋ฌด์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•˜๋‹ค๋ณด๋ฉด ํƒ€์ž… ๋‚ด ๋กœ์ž‰ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด์„œ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ณ  ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์„œ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ํƒ€์ž…๋‚ด๋กœ์ž‰ ๊ธฐ๋ฒ•์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜๋ฌธ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์„œ ์ฝ”๋“œ์— ํ’ˆ์งˆ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ฒ• ์ค‘์— ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„์— ์˜ˆ์ œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉฐ ํ•„์š”ํ•œ ์˜ˆ์ œ๋“ค์ž…๋‹ˆ๋‹ค.

์œ„์— ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•™์Šตํ•˜๊ณ  ์ž๊ธฐ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 


 

์žฌ๋ฐŒ๋Š” ์˜ค๋Š˜์˜ ๋ ๋ณ„ ์šด์„ธ ๋ณด๊ณ  ๊ฐ€์„ธ์š”! 

 

 

https://cometruedream.tistory.com/247

 

[React] Tailwind ํ•œ์ค„, ๋‘์ค„, ์„ธ์ค„ ํšจ๊ณผ className ์ปค์Šคํ…€

๐Ÿคท‍โ™‚๏ธ Tailwind ํ•œ์ค„, ๋‘์ค„, ์„ธ์ค„ ํšจ๊ณผํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ค‘ ๋ฐฐ๋„ˆ ๋งํฌ์— URL ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ 3์ค„ ํšจ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. React + Tailwind CSS ์…‹ํŒ…๋œ ํ”„๋กœ์ ํŠธ ์—ฌ์„œ CSS ํŒŒ์ผ & style ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/243

 

NestJS Lifecycle (์ƒ๋ช…์ฃผ๊ธฐ) ๊ฐœ๋…

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œ Nest JS ๊ฐœ๋…?Nest JS๋Š” Node JS ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ๋‹นํžˆ ์˜ค๋žซ๋™์•ˆ Express ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ์••๋„์ ์ธ ์ 

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/242

 

๋ฆฌ์•กํŠธ Vite Proxy ํ™œ์šฉํ•œ CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค๋Ÿฌ ๊ฐœ๋…๊ณผ webpack vs vite ๋น„๊ต์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ๊ธ€์„ ๋ณด์‹œ๋ฉด ๋” ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค^^ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ฒˆ๋“ค๋Ÿฌ ๊ฐœ๋…๊ณผ webpack vs vite ๋น„๊ตhttps://comet

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/241

 

React ํด๋”๊ตฌ์กฐ FSD ๊ธฐ๋Šฅ ๋ถ„ํ™œ ์„ค๊ณ„ ์•„ํ‚คํ…์ฒ˜

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ํด๋” ๊ตฌ์กฐ, ์„ค๊ณ„์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— React FSD ํด๋”๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ์˜ˆ์ •์ด๋ผ์„œ FSD ์•„ํ‚คํ…

cometruedream.tistory.com

 

 

https://cometruedream.tistory.com/244

 

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” Prisma ๋ช…๋ น์–ด ์ •๋ฆฌ

๐Ÿคท‍โ™‚๏ธ Prisma ๋ช…๋ น์–ด ๋ณธ๋ก ์— ์•ž์„œ Prisma๋ž€?Nest JS ํ”„๋ ˆ์ž„์›Œํฌ์™€ Prisma ORM์„ ํ™œ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Prisma๋Š” Node JS ๊ธฐ๋ฐ˜์— ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ์ž˜๋˜๋ฉฐ Prisma + DB ์—ฐ๋™์œผ

cometruedream.tistory.com