Typescript
Typescript 기초 문법 4- 제너릭
Yujzu
2024. 5. 25. 15:54
제너릭(Generic)
- 함수, 클래스, 인터페이스에서 사용 가능
15. 제너릭- 함수
interface Obj {
x: number
}
type Arr = [number, number] // 튜플 타입,
// 오버로딩
function toArray(a: string, b: string): string[]
function toArray(a: number, b: number): number[]
function toArray(a: Obj, b: Obj): Obj[]
function toArray(a: Arr, b: Arr): Arr[]
function toArray(a: any, b: any) {
return [a,b]
}
이런식으로 오버로딩 선언을 계속 추가하면 비효율적이니 제너릭을 사용한다.
// 제너릭 문법 사용 (T는 Type의 약어)
// 어떤 type을 받을지 아직 모른다.
function toArray<T>(a: T, b: T) { // T는 타입정보를 들고있음
return [a,b]
}
toArray('Neo','May') // 'Neo'가 매개변수 a에 할당되면서 제너릭 T는 string이 된다 (타입 추론)
or
toArray<string>('Neo','May') // T는 string이라고 명시적으로 지정
* 타입스크립트가 타입추론 할 수 있는 상황을 만드는 것이 좋다.
toArray(true, 'false') // 에러발생, T는 boolean으로 추론되었으므로
toArray([1,2], [3,4,5]) // 에러x , T는 일반 배열 타입으로 인식(number[])
toArray<Arr>([1,2],[3,4]) // 명시적으로 튜플타입을 작성해준다.
16. 제너릭- 클래스
17. 제너릭- 인터페이스, 제약 조건
interface MyData<T> {
name: string
value: T
}
const dataA: MyData<string> = {
name: 'Data A',
value: 'Hello' // T가 string
}
const dataB: MyData<number> = {
name: 'Data B',
value: 1234 // T가 number
}
const dataD: MyData<number[]> = {
name: 'Data D',
value: [1,2,3,4] // T가 number배열
}
// 제약조건 (constraints)
T가 모든 타입을 받지않고 제한을 두고 싶을 때
// T를 문자데이터와 숫자데이터로만 제한
interface MyData<T extends string | number> { // T라는 type 변수는 string이나 number의 타입 내용을 상속받는다
name: string
value: T
}