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

[Typescript] μ œλ„€λ¦­ Generic <T>

FillByCoding 2023. 12. 23. 16:50
λ°°μ—΄ νƒ€μž… 
  • μ–΄λ–€ νƒ€μž…μ˜ 데이터가 μ €μž₯λ˜λ“  μƒκ΄€ν•˜μ§€ μ•ŠμœΌλ©°
  • μ €μž₯ν•˜λŠ” μš”μ†Œκ°€ λ¬Έμžμ—΄ λͺ©λ‘, μˆ«μžν˜• λͺ©λ‘, 객체 λͺ©λ‘, ν˜Όν•©λœ λ°μ΄ν„°μ˜ λͺ©λ‘μ΄λ“  μƒκ΄€ν•˜μ§€ μ•Šμ§€λ§Œ 적어도 정보가 μ €μž₯λ˜λŠ” 것인지에 λŒ€ν•΄μ„œλŠ” 확인 함
μ œλ„€λ¦­ νƒ€μž… Generic <T>
  • νƒ€μž… μ•ˆμ „μ„±κ³Ό κ²°ν•©λœ μœ μ—°μ„±μ„ 제곡
  • μ „λ‹¬ν•˜λŠ” κ°’μ΄λ‚˜ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 값을 μœ μ—°ν•˜κ²Œ μ§€μ •ν•  수 있음
  • μΆ”κ°€ν•œ μ œμ•½ 쑰건이 μžˆλ‹€λ©΄ κ·Έ 쑰건만 μ€€μˆ˜ν•˜λ©΄ 됨
const names: Array<string> = []; // string []

const names: Array<string | number> = []; // string [], number []
  • promise νƒ€μž…
const promise: Promise<string> = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("This is done!");
  }, 2000);
});

promise.then(data => {
    data.split(' ')
})
μ œλ„€λ¦­ ν•¨μˆ˜
function merge<T, U>(objA: T, objB: U) {
	return Object.assign(objA, objB);
}

const mergedObj = merge({name: 'Max', hobbies: ['Sports']}, {age:30});
console.log(mergedObj.age);
μ œμ•½ 쑰건 μ„€μ •ν•˜κΈ°
  • μ œμ•½ 쑰건을 μ‚¬μš©ν•˜λ©΄ μ œλ„€λ¦­ ν•¨μˆ˜ 등에 μ‚¬μš©ν•  수 μžˆλŠ” ꡬ체적인 νƒ€μž…μ˜ λ²”μœ„λ₯Ό 쒁힐 수 있음
function merge<T extends object, U extends object>(objA: T, objB: U) {
  return Object.assign(objA, objB);
}

const mergedObj = merge({ name: "yumi", hobbies: ["Sports"] }, { age: 30 });

console.log(mergedObj);
  • λ‹€λ₯Έ 일반 ν•¨μˆ˜
interface Lengthy {
  length: number;
}

function countAndDescribe<T extends Lengthy>(element: T) {
  let descriptionText = "Got no value"; // 길이가 μ—†λŠ” μš”μ†Œλ₯Ό μ „λ‹¬ν•˜λŠ” 경우
  if (element.length === 1) {
    descriptionText = "Got 1 element.";
  } else if (element.length > 1) {
    descriptionText = "Got " + element.length + "elements.";
  }

  return [element, descriptionText];
}

console.log(countAndDescribe(['Sports', 'Cooking']));
keyof
  • keyof ν‚€μ›Œλ“œλ₯Ό μ§€λ‹ˆλŠ” μ œλ„€λ¦­ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 이와 같은 μ •ν™•ν•œ ꡬ쑰λ₯Ό κ°–κ³ μž ν•œλ‹€λŠ” 것을 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—κ²Œ μ•Œλ €μ€Œ
function extractAndConvert<T extends object, U extends keyof T>(
  obj: T,
  key: U
) {
  return "Value: " + obj[key];
}

extractAndConvert({ name: "yumi" }, "name");
μ œλ„€λ¦­ 클래슀
  • 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” 데이터 ν˜•μ‹μ„ λ™μ μœΌλ‘œ μ§€μ •ν•  수 μžˆλŠ” κΈ°λŠ₯을 제곡
  • 이λ₯Ό 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ—°μ„±μ„ 높일 수 있음
// μ œλ„€λ¦­ 클래슀 μ„ μ–Έ
class Container<T> {
  private value: T;

  constructor(initialValue: T) {
    this.value = initialValue;
  }

  // 값을 μ„€μ •ν•˜λŠ” λ©”μ„œλ“œ
  setValue(newValue: T): void {
    this.value = newValue;
  }

  // ν˜„μž¬ 값을 κ°€μ Έμ˜€λŠ” λ©”μ„œλ“œ
  getValue(): T {
    return this.value;
  }
}

// 숫자λ₯Ό μ €μž₯ν•˜λŠ” Container μΈμŠ€ν„΄μŠ€ 생성
const numberContainer = new Container<number>(42);

// λ¬Έμžμ—΄μ„ μ €μž₯ν•˜λŠ” Container μΈμŠ€ν„΄μŠ€ 생성
const stringContainer = new Container<string>("Hello, TypeScript!");

// μ‚¬μš© μ˜ˆμ‹œ
console.log(numberContainer.getValue()); // 좜λ ₯: 42
console.log(stringContainer.getValue()); // 좜λ ₯: Hello, TypeScript!

// κ°’ λ³€κ²½
numberContainer.setValue(123);
stringContainer.setValue("Updated value");

console.log(numberContainer.getValue()); // 좜λ ₯: 123
console.log(stringContainer.getValue()); // 좜λ ₯: Updated value
partial νƒ€μž…
interface CourseGoal {
  title: string;
  description: string;
  completeUntil: Data;
}

function createCourseGoal(
  title: string,
  description: string,
  data: Date
): CourseGoal {
  let courseGoal: Partial<CourseGoal> = {}; 
  courseGoal.title = title;
  courseGoal.description = description;
  courseGoal.completeUntil = date;
  return courseGoal as CourseGoal;
}
μ œλ„€λ¦­κ³Ό μœ λ‹ˆμ–Έ νƒ€μž…μ˜ 차이
  • μœ λ‹ˆμ–Έ νƒ€μž…
    • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ 이 νƒ€μž…λ“€ 쀑 ν•˜λ‚˜λ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜κ°€ ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©
    • λͺ¨λ“  λ©”μ†Œλ“œ ν˜ΈμΆœμ΄λ‚˜ λͺ¨λ“  ν•¨μˆ˜ ν˜ΈμΆœλ§ˆλ‹€ λ‹€λ₯Έ νƒ€μž…μ„ μ§€μ •ν•˜κ³ μž ν•˜λŠ” 경우 μ‚¬μš©
  • μ œλ„€λ¦­ νƒ€μž…
    • νŠΉμ • νƒ€μž…μ„ κ³ μ •ν•˜κ±°λ‚˜, 전체 클래슀 μΈμŠ€ν„΄μŠ€μ— 걸쳐 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, 전체 ν•¨μˆ˜μ— 걸쳐 같은 νƒ€μž…μ„ μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ μ œλ„€λ¦­ νƒ€μž… μ‚¬μš©
    • ν•œ νƒ€μž…μœΌλ‘œ κ³ μ • μ‹œν‚΄
    • λ‹€μ–‘ν•œ νƒ€μž…κ³Ό ν•¨κ»˜ μž‘λ™ν•˜λŠ” νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 경우 (예: λ‹€λ₯Έ νƒ€μž…μ˜ 데이터λ₯Ό λ‚΄λ³΄λ‚΄λŠ” 객체)
LIST