10-1. 제네릭 프로그래밍

euNung·2022년 6월 9일
0

타입스크립트

목록 보기
8/10
  • 제네릭 타입
    : 해당 심벌의 타입을 미리 지정하지 않고 다양한 타입에 대응하려고 할 때 사용
// 제네릭 인터페이스 구문
interface Ivaluable<T> {
	value: T
}

// 제네릭 함수 구문
function identify<T>(arg: T): T {return arg}

// 제네릭 타입 별칭 구문
type IValuable<T> = {
  	value: T
}

// 제네릭 클래스 구문
class Valuable<T>
  constructor(public value: T) {}
}
  • 제네릭 선언 위치
type Filter = {
  <T>(array: T[], f: (tiem: T) => boolean): T[]
}
let filter: Filter = // ...

type Filter<T> = {
  (array: T[], f: (tiem: T) => boolean): T[]
}
let filter: Filter<number> = // ...

type Filter = <T>(array: T[], f: (tiem: T) => boolean): T[]
let filter: Filter = // ...

type Filter<T> = (array: T[], f: (tiem: T) => boolean): T[]
let filter: Filter<string> = // ...

function Filter<T>(array: T[], f: (tiem: T) => boolean): T[] {}
  • 제네릭 타입 제약
    : 제네릭 함수의 타입을 제한하고 싶을 때 사용
<최종 타입1 extends 타입1, 최종 타입2 extends 타입2>(a: 최종 타입1, b: 최종타입2){}

const printValueT = <Q, T extends IValuable<Q>>(o: T) => console.log(o.value)
  • new 타입 제약
// 방법1
const create = <T extends {new(): T}>(type: T): T => new type()

// 방법2
const create = <T>(type: new() => T): T => new type()
- 매개 변수 전달
	const create = <T>(type: {new(...args): T}, ...args): T => new type(...args)
    
    // ex)
    class Point { 
      constructor(public  x: number, public y: number) {}
    }

	[create(Date), create(Point, 0, 0)].forEach(s => console.log(s))

// 실행결과
Thu Jun 09 2022 15:52:25 GMT+0900 (한국 표준시)
Point {x: 0, y: 0}
  • 인덱스 타입 제약
<T, K extends keyof T>
  
// ex)
const pick = <T, K extends keyof T>(obj: T, keys: K[]) =>
    keys.map(key => ({[key]: obj[key]}))
        .reduce((result, value) => ({...result, ...value}), {})

-- 두 번째 pick함수에서 obj에 없는 key를 불러 오류 발생

profile
프론트엔드 개발자

0개의 댓글