반응형
다형성
함수와 타입처럼, 클래스와 인터페이스도 기본값과 상한/하한 설정을 포함한 다양한 제네릭 타입 매개변수 기능을 지원합니다.
제네릭 타입의 범위는 클래스나 인터페이스 전체가 되게 할 수도 있고 특정 메서드로 한정할 수도 있습니다.
class FirstMap<K, V>{ // ①
constructor(initialKey: K, initialValue: V){ // ②
// ...
}
get(key: K): V { // ③
// ...
}
set(key: K, value: V){
// ...
}
merge<K1, V1>(map: FirstMap<K1, V1>): FirstMap<K | K1, V | V1>{ // ④
// ...
}
static of<K, V>(k: K, v: V): FirstMap<K, V>{ // ⑤
// ...
}
}
- class와 함께 제네릭을 선언했으므로 클래스 전체에서 타입을 사용할 수 있습니다. FirstMap의 모든 인스턴스 메서드와 인스턴스 프로퍼티에서 K와 V를 사용할 수 있습니다.
- constructor에는 제네릭 타입을 선언할 수 없습니다. constructor 대신 class 선언에 사용해야 합니다.
- 클래스로 한정된 제네릭 타입은 클래스 내부의 어디에서나 사용할 수 있습니다.
- 인스턴스 메서드는 클래스 수준 제네릭을 사용할 수 있으며 자신만의 제네릭도 추가로 선언할 수 있습니다. .merge는 클래스 수준 제네릭은 K와 V에 더해 자신만의 제네릭 타입인 K1과 V1을 추가로 선언했습니다.
- 정적 메서드는 클래스의 인스턴스 변수에 값 수준에서 접근할 수 없듯이 클래스 수준의 제네릭을 사용할 수 없습니다. 따라서 of는 1에서 선언한 K와 V에 접근할 수 없고 자신만의 K와 V를 직접 선언했습니다.
인터페이스에도 제네릭을 사용할 수 있습니다.
interface FirstMap<K, V>{
get(key: K): V
set(key: K, value: V): void
}
함수와 마찬가지로 제네릭에 구체 타입을 명시하거나 TypeScript가 타입으로 추론하도록 할 수 있습니다.
let a = new FirstMap<string, number>('k', 1) // FirstMap<string, number>
let b = new FirstMap('k', true) // FirstMap<string, boolean>
a.get('k')
b.set('k', false)
반응형
'👶 TypeScript' 카테고리의 다른 글
데코레이터(decorator) (0) | 2023.01.16 |
---|---|
믹스인(mixin) (0) | 2023.01.16 |
클래스는 값과 타입을 모두 선언한다 (0) | 2023.01.16 |
클래스는 구조 기반 타입을 지원한다 (0) | 2023.01.16 |
인터페이스 구현 VS 추상 클래스 상속 (0) | 2023.01.15 |