반응형
언제 제네릭 타입이 한정되는가?
제네릭 타입의 선언 위치에 따라 타입의 범위뿐 아니라 TypeScript가 제네릭 타입을 언제 구체 타입으로 한정하는지도 결정됩니다.
type Filter = <T>(array: T[], f: (item: T) => boolean) => T[]
let filter: Filter = (array, f) => {
const result = []
for(let i = 0; i < array.length; i++){
const item = array[i]
if(f(item)) {
result.push(item)
}
}
return result
}
위의 예시에서 <T>를 호출 시그니처의 일부로 선언했으므로 TypeScript는 Filter 타입의 함수를 실제 호출할 때 구체 타입을 T로 한정합니다.
이와 달리 T의 범위를 Filter의 타입 별칭으로 한정하려면 Filter를 사용할 때 타입을 명시적으로 한정하게 해야 합니다.
type Filter<T> = (array: T[], f: (item: T) => boolean) => T[]
let filter: Filter = (array, f) => { // 'Filter' 제네릭 형식에 1 형식 인수가 필요합니다.ts(2314)
const result = []
for(let i = 0; i < array.length; i++){
const item = array[i]
if(f(item)) {
result.push(item)
}
}
return result
}
type OtherFilter = Filter // 'Filter' 제네릭 형식에 1 형식 인수가 필요합니다.ts(2314)
let filter: Filter<number> = (array, f) => {
const result = []
for(let i = 0; i < array.length; i++){
const item = array[i]
if(f(item)) {
result.push(item)
}
}
return result
}
type StringFilter = Filter<string>
let stringFilter: StringFilter = (array, f) => {
const result = []
for(let i = 0; i < array.length; i++){
const item = array[i]
if(f(item)) {
result.push(item)
}
}
return result
}
보통 TypeScript는 제네릭 타입을 사용하는 순간에 제네릭과 구체 타입을 한정합니다.
제네릭 타입을 사용하는 순간이란 함수에선 함수를 호출할 때를 의미하고 클래스라면 클래스를 인스턴스화할 때, 타입 별칭과 인터페이스에선 이들을 사용하거나 구현할 때를 가리킵니다.
반응형
'👶 TypeScript' 카테고리의 다른 글
제네릭 타입 추론 (0) | 2023.01.13 |
---|---|
제네릭을 어디에 선언할 수 있을까? (0) | 2023.01.13 |
다형성 (0) | 2023.01.12 |
오버로드된 함수 타입 (0) | 2023.01.12 |
문맥적 타입화 (0) | 2023.01.12 |