250x250
Rainbow๐ŸŒˆCoder
My dev Note๐Ÿ“’
Rainbow๐ŸŒˆCoder
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (411)
    • ๊ณต์ง€์‚ฌํ•ญ (0)
    • Debugger (10)
      • Visual Studio Debugger (1)
      • Chrome DevTools (3)
      • Visual Studio Code Debugger (4)
      • eclipse (1)
      • intelliJ (1)
    • OOP (2)
      • OOP (2)
    • TypeScript (54)
      • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript (54)
    • Javascript (87)
      • Javascript (45)
      • Node.js (19)
      • React (5)
      • FE ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ • (3)
      • React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ (6)
      • next.js (2)
      • pixi.js (7)
    • ๋งˆํฌ์—… (23)
      • Html & Css (23)
    • C# (80)
      • C# (12)
      • ์ด๊ฒƒ์ด C#์ด๋‹ค (68)
    • C++ (30)
      • c++ (27)
      • win api (3)
    • Unity (18)
      • Unity(๊ธฐ์ดˆ) (8)
      • Unity(C#์ค‘๊ธ‰) (5)
      • ์œ ๋‹ˆํ‹ฐ ํฌํ†ค(๋„คํŠธ์›Œํฌ) (4)
      • unity c# MyCode (1)
    • Java & Spring (29)
      • Java (11)
      • ์Šคํ”„๋ง (8)
      • Java Algorithm (9)
      • Javs Data Structures (1)
    • ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (15)
      • ์ž๋ฃŒ๊ตฌ์กฐ (5)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
    • ํ˜•์ƒ๊ด€๋ฆฌ (15)
      • Git (11)
      • ์†Œ์ŠคํŠธ๋ฆฌ (3)
    • ๊ทธ๋ž˜ํ”ฝ์Šค (7)
      • WebGl (7)
    • AWS (3)
      • aws (3)
    • ๋ฆฌ๋ˆ…์Šค (5)
      • ๋ฆฌ๋ˆ…์Šค (5)
    • ์ฑ… ๋ฆฌ๋ทฐ (13)
      • ํด๋ฆฐ์ฝ”๋“œ(์ฑ…๋ฆฌ๋ทฐ) (3)
      • ์œ ์ง€๋ณด์ˆ˜๊ฐ€๋Šฅํ•œ์ฝ”๋”ฉ์˜๊ธฐ์ˆ C#ํŽธ(์ฑ…๋ฆฌ๋ทฐ) (1)
      • ๋ฆฌํŒฉํ† ๋ง(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธํŒ) (9)
    • Server (2)
      • ๊ฒŒ์ž„ ์„œ๋ฒ„(๋„คํŠธ์›Œํฌ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ,OS) (2)
    • ์„ค๊ณ„, ์•„ํ‚คํ…์ณ (4)
    • ํŒŒ์ด์ฌ (5)
    • ๋””์ž์ธํŒจํ„ด (2)
    • mocha (2)
    • Jest (1)
    • Spine (1)
    • ์ธ๊ณต์ง€๋Šฅ (1)
      • ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š”๋จธ์‹ ๋Ÿฌ๋‹+๋”ฅ๋Ÿฌ๋‹ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ปดํฌ์ง€์…˜
  • ใ…ฃใ„ท
  • MySQL
  • ์œ„์ž„

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Rainbow๐ŸŒˆCoder

My dev Note๐Ÿ“’

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํ•œ์ •๋œ ๋‹คํ˜•์„ฑ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด์ง„ํŠธ๋ฆฌ ์˜ˆ์ œ ๋ถ„์„
TypeScript/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํ•œ์ •๋œ ๋‹คํ˜•์„ฑ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด์ง„ํŠธ๋ฆฌ ์˜ˆ์ œ ๋ถ„์„

2022. 4. 26. 18:26
728x90

๋ณธ ํฌ์ŠคํŒ… ์˜ˆ์ œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

 

1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ ๋‚ด๊ฐ€ ํ’€์–ด๋ณธ ๊ฒƒ(ํ•œ ํฌ์ธํŠธ ๋ฏธ์Šค, ์•„์ง๋„ ์ƒ์„ฑ์ž์— ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฐ›์•„๋“ค์ด๋Š”๊ฒŒ ์–ด์ƒ‰...)

type TreeNode = {
  value: string;
};

type LeafNode = TreeNode & {
  isLeaf: true;
};

type InnerNode = TreeNode & {
  children: [TreeNode] | [TreeNode, TreeNode];
};

let a: TreeNode = { value: "a" }; //ํ†ต๊ณผ
let b: LeafNode = { value: "b", isLeaf: true }; //ํ†ต๊ณผ
let c: InnerNode = { value: "c", children: [b] }; //ํ†ต๊ณผ

let a1 = mapNode(a, (_) => _.toUpperCase()); //TreeNode
let b1 = mapNode(b, (_) => _.toUpperCase()); //LeafNode
let c1 = mapNode(c, (_) => _.toUpperCase()); //InnerNode

function mapNode<T extends TreeNode>(node: T, f: (value: string) => string): T {
  return {
    ...node,
    value: node.value.toUpperCase(),
  };
}

console.log(a1.value); //A
console.log(b1.value); //B
console.log(c1.value); //C

2. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฑ… ๋ชจ๋ฒ”๋‹ต์•ˆ

type TreeNode = {
  value: string;
};

type LeafNode = TreeNode & {
  isLeaf: true;
};

type InnerNode = TreeNode & {
  children: [TreeNode] | [TreeNode, TreeNode];
};

let a: TreeNode = { value: "a" }; //ํ†ต๊ณผ
let b: LeafNode = { value: "b", isLeaf: true }; //ํ†ต๊ณผ
let c: InnerNode = { value: "c", children: [b] }; //ํ†ต๊ณผ

let a1 = mapNode(a, (_) => _.toUpperCase()); //TreeNode
let b1 = mapNode(b, (_) => _.toUpperCase()); //LeafNode
let c1 = mapNode(c, (_) => _.toUpperCase()); //InnerNode

function mapNode<T extends TreeNode>(node: T, f: (value: string) => string): T {
  return {
    ...node,
    value: f(node.value),
  };
}

console.log(a1.value); //A
console.log(b1.value); //B
console.log(c1.value); //C

 

 

์ œ๋„ค๋ฆญ ํƒ€์ž… T๋ฅผ ์‚ฌ์šฉ ์ค‘์ผ๋•Œ์— ์ •ํ™•ํ•˜๊ฒŒ T์™€ ๊ฐ™์€ ํƒ€์ž…์ž„์„ ํ‘œํ˜„ํ•˜๊ธฐ๋ณด๋‹ค๋Š”
”์ด ํƒ€์ž…์€ U ํƒ€์ž…์ด๊ณ , ์ ์–ด๋„ T ํƒ€์ž…์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด” ๊ฐ™์€ ์ƒํ™ฉ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์„ ‘U๊ฐ€ T์˜ ์ƒํ•œ ํ•œ๊ณ„(upper bound)’ ๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ์™œ ํ•„์š”ํ•œ์ง€ ์ด์ง„ ํŠธ๋ฆฌ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

 

์„ธ ์ข…๋ฅ˜ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

1. ์ผ๋ฐ˜ TreeNode

2. ์ž์‹์„ ๊ฐ–์ง€ ์•Š๋Š” TreeNode์ธ LeafNode

3. ์ž์‹์„ ๊ฐ–๋Š” TreeNode์ธ InnerNode

๋ฐฐ๊ฒฝ ์ง€์‹:
- ์ด์ง„ํŠธ๋ฆฌ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.
- ์ด์ง„ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
- ๋…ธ๋“œ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
- ๋…ธ๋“œ๋Š” ์žŽ๋…ธ๋“œ(์ž์‹์—†์Œ) ๋˜๋Š” ๋‚ด๋ถ€ ๋…ธ๋“œ(์ ์–ด๋„ ํ•œ ๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์ง) ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.

๋จผ์ € ๊ฐ ๋…ธ๋“œ์˜ ํƒ€์ž…์„ ์„ ์–ธํ•œ๋‹ค.

 

//value๋ผ๋Š” ํ•œ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋งŒ ๊ฐ–๋Š” ๊ฐ์ฒด
type TreeNode = {
  value: string;
};

//TreeNode๊ฐ€ ๊ฐ–๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ’์ด ํ•ญ์ƒ true์ธ isLeaf ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จ
type LeafNode = TreeNode & {
  isLeaf: true;
};

//TreeNode๊ฐ€ ๊ฐ–๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ๋ฟ ์•„๋‹ˆ๋ผ ํ•œ ๊ฐœ๋‚˜ ๋‘ ๊ฐœ์˜ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š” children
//ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จ
type InnerNode = TreeNode & {
  children: [TreeNode] | [TreeNode, TreeNode];
};

๋‹ค์Œ์œผ๋กœ TreeNode๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ value์— ๋งคํ•‘ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด ์ƒˆ๋กœ์šด Tree Node๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” mapNode ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค.

๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Node ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ด๋ณด์ž.

let a: TreeNode = { value: "a" };
let b: LeafNode = { value: "b", isLeaf: true };
let c: InnerNode = { value: "c", children: [b] };

let a1 = mapNode(a, (_) => _.toUpperCase()); //TreeNode
let b1 = mapNode(b, (_) => _.toUpperCase()); //LeafNode
let c1 = mapNode(c, (_) => _.toUpperCase()); //InnerNode

TreeNode์˜ ์„œ๋ธŒํƒ€์ž…์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ๊ฐ™์€ ์„œ๋ธŒํƒ€์ž…์„ mapNode ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„

(LeafNode๋ฅผ ์ „๋‹ฌํ•˜๋ฉด LeafNode ๋ฐ˜ํ™˜, InnerNode๋ฅผ ์ „๋‹ฌํ•˜๋ฉด InnerNode๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉฐ, TreeNode๋ฅผ ์ „๋‹ฌํ•˜๋ฉด TreeNode๊ฐ€ ๋ฐ˜ํ™˜

function mapNode<T extends TreeNode>(node: T, f: (value: string) => string): T {
  return {
    ...node,
    value: f(node.value),
  };
}

 

<์ง€๊ธˆ๊นŒ์ง€ ์ „์ฒด ์ฝ”๋“œ>

type TreeNode = {
  value: string;
};

type LeafNode = TreeNode & {
  isLeaf: true;
};

type InnerNode = TreeNode & {
  children: [TreeNode] | [TreeNode, TreeNode];
};

let a: TreeNode = { value: "a" };
let b: LeafNode = { value: "b", isLeaf: true };
let c: InnerNode = { value: "c", children: [b] };

let a1 = mapNode(a, (_) => _.toUpperCase()); //TreeNode
let b1 = mapNode(b, (_) => _.toUpperCase()); //LeafNode
let c1 = mapNode(c, (_) => _.toUpperCase()); //InnerNode

function mapNode<T extends TreeNode>(node: T, f: (value: string) => string): T {
  return {
    ...node,
    value: f(node.value),
  };
}

1. mapNode๋Š” ํ•œ ๊ฐœ์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ T๋ฅผ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜. T์˜ ์ƒํ•œ ๊ฒฝ๊ณ„๋Š” TreeNode.

(์ฆ‰, T๋Š” TreeNode ์ด๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด TreeNode์˜ ์„œ๋ธŒํƒ€์ž…)

function mapNode<T extends TreeNode>

T ์ž๋ฆฌ์— (๋นˆ๊ฐ์ฒด{}, null, TreeNode ๋ฐฐ์—ด ๋“ฑ์˜) TreeNode๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฐ”๋กœ ๊ผฌ๋ถˆ๊ฑฐ๋ฆฌ๋Š” ๋นจ๊ฐ„ ๋ฐ‘์ค„.

 

 

์™œ T๋ฅผ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•˜๋ƒ๋ฉด,

 

extends TreeNode๋ฅผ ์ƒ๋žตํ•˜๊ณ  Tํƒ€์ž…์„ ๊ทธ์ € T๋ผ๊ณ ๋งŒ ์“ฐ๋ฉด (ํŠน์ • ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€) mapNode๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋˜์งˆ ๊ฒƒ์ด๋‹ค. T ํƒ€์ž…์— ์ƒํ•œ ๊ฒฝ๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ node.value๋ฅผ ์ฝ๋Š” ํ–‰์œ„๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ(์˜ˆ๋ฅผ ๋“ค์–ด ์ˆซ์ž๊ฐ€ ๊ฑด๋„ค์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.)

 

 

T๋ฅผ ์•„์˜ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  mapNode๋ฅผ (node: TreeNode, f:(value:string)=>string) =>TreeNode์ฒ˜๋Ÿผ ์„ ์–ธํ•˜๋ฉด ๋งคํ•‘๋˜๋ฉด์„œ ํƒ€์ž…์ •๋ณด๊ฐ€ ๋‚ ์•„๊ฐ€์„œ a1, b1, c1์ด ๋ชจ๋‘ TreeNode๊ฐ€ ๋œ๋‹ค.

 

 

T extends TreeNode๋ผ๊ณ  ํ‘œํ˜„ํ•จ์œผ๋กœ์จ ๋งคํ•‘ํ•œ ์ดํ›„์—๋„ ์ž…๋ ฅ ๋…ธ๋“œ๊ฐ€ ํŠน์ • ํƒ€์ž…(TreeNode, LeafNode, InnerNode)์ด๋ผ๋Š” ์ •๋ณด๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.

<๋ชจ๋ฒ”>

  value: string;
};

type LeafNode = TreeNode & {
  isLeaf: true;
};

type InnerNode = TreeNode & {
  children: [TreeNode] | [TreeNode, TreeNode];
};

let a: TreeNode = { value: "a" }; //ํ†ต๊ณผ
let b: LeafNode = { value: "b", isLeaf: true }; //ํ†ต๊ณผ
let c: InnerNode = { value: "c", children: [b] }; //ํ†ต๊ณผ

let a1 = mapNode(a, (_) => _.toUpperCase()); //TreeNode
let b1 = mapNode(b, (_) => _.toUpperCase()); //LeafNode
let c1 = mapNode(c, (_) => _.toUpperCase()); //InnerNode

function mapNode<T extends TreeNode>(node: T, f: (value: string) => string): T {
  return {
    ...node,
    value: f(node.value),
  };
}

console.log(a1); //{ value: 'A' }
console.log(b1); //{ value: 'B', isLeaf: true }
console.log(c1); //{ value: 'C', children: [ { value: 'b', isLeaf: true } ] }

 

 

 

์—ฌ๋Ÿฌ ์ œํ•œ์„ ์ ์šฉํ•œ ํ•œ์ •๋œ ๋‹คํ˜•์„ฑ

 

์œ„์˜ ์˜ˆ์—์„œ๋Š” T๋Š” ์ ์–ด๋„ TreeNode์—ฌ์•ผ ํ•œ๋‹ค๋Š” ํƒ€์ž… ์ œํ•œ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹จ์ˆœํžˆ ์ธํ„ฐ์„น์…˜(&)์œผ๋กœ ์ œํ•œ๋“ค์„ ์ด์–ด๋ถ™์ด๋ฉด ๋œ๋‹ค.

type HasSides = { numberOfSides: number };
type SidesHaveLength = { sideLength: number };
function logPerimeter<T extends HasSides & SidesHaveLength>(s: T): T {
  console.log(s.numberOfSides * s.sideLength);
  return s;
}
type Square = HasSides & SidesHaveLength;
let square: Square = { numberOfSides: 4, sideLength: 3 };
logPerimeter(square);

logPerimeter์€ Shape ํƒ€์ž…์˜ ์ธ์ž s ํ•œ ๊ฐœ๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋‹ค.

Shape๋Š” HasSides ํƒ€์ž…๊ณผ SideHaveLength ํƒ€์ž…์„ ์ƒ์†๋ฐ›๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๋‹ค. ์ฆ‰, Shape๋Š” ์ ์–ด๋„ ๊ธธ์ด(length)๋ฅผ ๊ฐ–๋Š” ๋ณ€(side)๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

logPerimeter๋Š” ์ธ์ˆ˜์™€ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

 

์ œ๋„ค๋ฆญ | ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“œ๋ถ

์ œ๋„ค๋ฆญ(Generics)์˜ ์‚ฌ์ „์  ์ •์˜ ์ œ๋„ค๋ฆญ์€ C#, Java ๋“ฑ์˜ ์–ธ์–ด์—์„œ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ž์ฃผ ํ™œ์šฉ๋˜๋Š” ํŠน์ง•์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ํ•œ๊ฐ€์ง€ ํƒ€์ž…๋ณด๋‹ค ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒ€์ž…์—์„œ ๋™์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ

joshua1988.github.io

์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์— ์–ด๋А ์ •๋„ ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

function logText<T>(text: T): T {
  console.log(text.length); // Error: T doesn't have .length
  return text;
}

์ธ์ž์˜ ํƒ€์ž…์— ์„ ์–ธํ•œ T๋Š” ์•„์ง ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— length ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜

ํ•ด๋‹น ํƒ€์ž…์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ length ์†์„ฑ ์ •๋„๋Š” ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

interface LengthWise {
  length: number;
}

function logText<T extends LengthWise>(text: T): T {
  console.log(text.length);
  return text;
}

์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฐ•์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ length์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋Š” ์ธ์ž๋งŒ ๋„˜๊ฒจ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

logText(10); // Error, ์ˆซ์ž ํƒ€์ž…์—๋Š” `length`๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
logText({ length: 0, value: 'hi' }); // `text.length` ์ฝ”๋“œ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ ์ ‘๊ทผ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๋ฏ€๋กœ ์˜ค๋ฅ˜ ์—†์Œ

๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ œ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ๋„ ์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function getProperty<T, O extends keyof T>(obj: T, key: O) {
  return obj[key];  
}
let obj = { a: 1, b: 2, c: 3 };

getProperty(obj, "a"); // okay
getProperty(obj, "z"); // error: "z"๋Š” "a", "b", "c" ์†์„ฑ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์„ ์„ ์–ธํ•  ๋•Œ <O extends keyof T> ๋ถ€๋ถ„์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฐ์ฒด์— ์—†๋Š” ์†์„ฑ๋“ค์€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ๋” ์ œํ•œ

 

https://kyounghwan01.github.io/blog/TS/fundamentals/type-aliases/#%E1%84%90%E1%85%B3%E1%86%A8%E1%84%8C%E1%85%B5%E1%86%BC

 

typescript - ํƒ€์ž… ๋ณ„์นญ (type-aliases)

typescript - ํƒ€์ž… ๋ณ„์นญ (type-aliases), ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ts

kyounghwan01.github.io

ํƒ€์ž… ๋ณ„์นญ

ํƒ€์ž… ๋ณ„์นญ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฑฐ์˜ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ

๊ฐ์ฒด ๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํƒ€์ž… ์ •์˜๋ฅผ ํ•˜๋Š” ์ผ.

type Developer = {
  name: string;
  skill: string;
};
 

ํƒ€์ž… ๋ณ„์นญ์—๋„ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

type typeGeneric<T> = {
  name: T;
};
 
ํŠน์ง•

ํƒ€์ž… ๋ณ„์นญ์€ ์ƒˆ๋กœ์šด ํƒ€์ž… ๊ฐ’์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •์˜ํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๊ด€์ฐฐํ•˜๋„๋ก ์ด๋ฆ„์„ ๋ถ€์—ฌ
๊ทธ๋ž˜์„œ interface๋ฅผ ์ •์˜ํ•˜๊ณ  ์ปค์„œ๋ฅผ hoverํ•˜๋ฉด interface xx ์ด๋ ‡๊ฒŒ ๋‚˜์˜ค์ง€๋งŒ type์€ type xx = {xx: xx}

์ธํ„ฐ์„น์…˜์— ์˜ํ•œ ํ™•์žฅ

ํƒ€์ž… ๋ณ„์นญ์€ extends๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์—†๊ณ  ์ธํ„ฐ์„น์…˜(&)๋ฅผ ์ด์šฉํ•ด ํ™•์žฅํ•œ๋‹ค.

type test1 = { name: string };

type test2 = test1 & { age: number };

const test3: test2 = { name: "d", age: 33 };
 

์œ„ ๋ฐฉ๋ฒ•์€ ์—„๋ฐ€ํžˆ ๋”ฐ์ง€๋ฉด ์ธํ„ฐ์„น์…˜์„ ์ด์šฉํ•˜์—ฌ test1 ํƒ€์ž…๊ณผ ์ถ”๊ฐ€๋œ ํƒ€์ž…์„ ํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•œ ๊ฒƒ์ด์ง€ test1 ํƒ€์ž…์„ extends๋กœ ์ƒ์† ๋ฐ›์•„ ํ™•์žฅํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ type์€ extend๊ฐ€ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ ๋งŒํ•˜๋ฉด interface๋ฅผ ์“ฐ๋„๋ก ํ•˜์ž.

728x90

'TypeScript > ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์—ฐ์Šต์šฉ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์„ธํŒ…  (0) 2022.04.27
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ(Typescript Compiler, TSC)  (0) 2022.04.27
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํƒ€์ž…๋ณ„์นญ ์ธํ„ฐ์„น์…˜์— ์˜ํ•œ ํ™•์žฅ  (0) 2022.04.26
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ณ„์นญ  (0) 2022.04.26
[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ts(2584) 'document' ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ 'dom'์„ ํฌํ•จํ•˜๋„๋ก 'lib' ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•ด ๋ณด์„ธ์š”.  (0) 2022.04.26
    'TypeScript/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์—ฐ์Šต์šฉ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์„ธํŒ…
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ(Typescript Compiler, TSC)
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ํƒ€์ž…๋ณ„์นญ ์ธํ„ฐ์„น์…˜์— ์˜ํ•œ ํ™•์žฅ
    • [ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ] ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ณ„์นญ
    Rainbow๐ŸŒˆCoder
    Rainbow๐ŸŒˆCoder
    ๋ชฐ๋ผ๋„ ๊ฒฐ๊ตญ์€ ์•„๋Š” ๊ฐœ๋ฐœ์ž, ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•œ ๋งค์ผ์˜ ํ•œ๊ฑธ์Œ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”