generice 타입은 함수의 파라미터와 같은 역할을 합니다.
함수나 클래스를 만들때 매개변수에 어떤 값이 와서 어떤값을 리턴할 지 모르겠을 때 사용하게 되는데,
generic타입은 만든 함수나 클래스를 실행 시 타입을 결정하게 만드는 문법입니다.
함수명<Type>(매개변수:Type):Type 으로 사용하게 됩니다.
처음 generic을 지정해 줄때 < >를 열어 지정해 줍니다.
function fn<T>(x:T):T{
return x
}
fn(1) // number
fn('hi') // string
fn(true) // boolean
fn<number>('1') // error
fn<string>('hi') // string
정말 파라미터처럼 generic을 만들어두고
나중에 타입이 뭔지 지정해 주니까 fn<number>의 호출같은 경우 에러가 나는 것도 확인 할 수 있습니다.
이때 <T>의 T는 Type의 약자로 관습처럼 사용하는 generic입니다.
그런데 위처럼 사용했을때 generic을 사용만 하면 타입스크립트에서 알아서 타입을 추론해 줄까요?
아래의 예제를 보면 아니라는 것을 알 수 있습니다.
function fn<T>(x:T):number{
return x.length // T에 Length속성이 없습니다.
}
fn<string[]>(['a','b','c'])
분명 generic을 통해 타입도 잘 지정했는데 왜 오류가 나올까요?
이는 타입스크립트가 T에 string[ ] 말고도 다른 타입도 올 수 있기때문에 안정적이지 않다 생각하여 오류가 나는겁니다.
이를 해결하기 위한 방법으로 Narrowing을 사용하거나 assult를 사용하는 방법도 있는데
generic타입을 사용할 때 많이 사용하는 방법은 Constrains라는 방법이 있습니다.
Constrains는 제한을 두기위한 문법입니다.
그런데 특별한 키워드를 사용하는게 아니고 여기서도 extends를 사용합니다.
하지만 interface에서 사용하는 extends가 복제를 의미했다면 Constrains에서는 타입체크를 의미합니다.
interface CheckLenth{
length:number
}
function fn<T extends CheckLength>(x:T):number{
return x.length
}
fn<string[]>(['a','b','c'])
CheckLength라는거를 T가 가질 수 있어 ? 라고 묻는 것과 같습니다.
여기서 T는 배열이니까 length라는 것을 가질 수 있으므로 함수가 잘 작동됩니다.
더 줄여서 쓸 수도 있습니다.
function fn<T extends {length:number}>(x:T):number{
return x.length
}
fn<string[]>(['a','b','c'])
extends로 체크할것이 많이 없다면 이렇게 사용할 수도 있습니다.
'Typescript' 카테고리의 다른 글
| [Typescript] Type Narrowing (0) | 2025.07.06 |
|---|---|
| [TypeScript] Type 요약 (0) | 2025.07.06 |
| [Typescript] keyof & typeof 연산자 (1) | 2025.07.01 |
| [Typescript] 배열 (0) | 2025.06.30 |
| [Typescript] Object (0) | 2025.06.14 |