// 제네릭 인터페이스 구문
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)
// 방법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를 불러 오류 발생