๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
typescript

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

by frontChoi 2025. 2. 26.
๋ฐ˜์‘ํ˜•

๐Ÿคฝ‍โ™‚๏ธ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ œํ•œ

์ œ๋„ค๋ฆญ์—์„œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๊ฒŒ๋Š” ํ•˜์ง€๋งŒ ํŠน์ •ํƒ€์ž…๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

 

 

๐Ÿ›ผ  ๊ธฐ๋ณธ์ ์ธ ์ œ์•ฝ ๊ฑธ๊ธฐ

string๋งŒ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ฝ์„ ๊ฑธ์–ด๋ณธ๋‹ค

 

type C ๊ฐ™์€ ๊ฒฝ์šฐ number๋ฅผ ๋„ฃ์–ด์„œ ์‹ค์ œ์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

type A๊ฐ€ string๋งŒ ํ—ˆ์šฉํ•˜๊ฒŒ๋” ์„ค์ •๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

// T๊ฐ€ string์ด์–ด์•ผ ํ•œ๋‹ค
type A<T extends string> = {
  value: T;
};

// error : number๋Š” string์ด ๋  ์ˆ˜ ์—†๋‹ค
type C = A<number>
// string extends string์ด ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค
type B = A<string>;

 

 

๐Ÿ›ผ  ํŠน์ • ํƒ€์ž…์„ ์ œ์•ฝ์„ ๊ฑธ์–ด๋ณด๊ธฐ

์›์‹œ ํƒ€์ž…์ด์•„๋‹Œ ํŠน์ •ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ์ œ์•ฝ์„ ๊ฑธ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Person์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ , Person์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.

 

๋งŒ์•ฝ makePerson์ด๋ผ๋Š” ํ•จ์ˆ˜์— name์ด๋ผ๋Š” ์†์„ฑ๋งŒ ๋„ฃ๋Š”๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

Person ์ธํ„ฐํŽ˜์ด์Šค๋Š” name,age๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

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

/* ํŠน์ • ํƒ€์ž…์„ ๊ฐ–๋„๋ก ์„ค์ • */
function makePerson<T extends Person>(person: T) {
  console.log(person.age, person.name);
}

const person1: Person = {
  name: "choi",
  age: 32,
};

makePerson(person1);
// error : Person์˜ ํ˜•ํƒœ์™€ ๊ฐ™์ง€๊ฐ€ ์•Š๋‹ค
makePerson({
 	name:'kim'
})

 

 

๐ŸŽฑ  ์œ ๋‹ˆ์˜จ ํ—ˆ์šฉ

์ œ์•ฝ์„ ๊ฑธ๋•Œ ์œ ๋‹ˆ์˜จ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค

string๊ณผ number๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค

function logging<T extends string | number>(log: T) {
  console.log(log);
}
logging(1);
logging("1");
//error : boolean์€ logging์˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค
logging(false);

 

 

๐Ÿฅ ๊ฐ์ฒด์˜ ํ‚ค๋กœ ์ œ์•ฝ๊ฑธ๊ธฐ

ํŠน์ • ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ฐ์ฒด์˜ ํ‚ค๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์ œ์•ฝ์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.

 

c๋ผ๋Š” ํ‚ค๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

/* ๊ฐ์ฒด์˜ ํ‚ค๋กœ ์ œ์•ฝ๊ฑธ๊ธฐ */
function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

getProperty({ a: 1, b: 2 }, "a");
// c๋ผ๋Š” key๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค
getProperty({ a: 1, b: 2 }, "c");
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€