function 함수(x :unknown[]) {
return x[0]
}
let a = 함수([4,2]) // <- a는 unknown타입, 4
a + 1 // <- error 발생
- 선언시점이 아닌 생성시점에 타입을 명시하여 가변적으로 타입을 사용할 수 있게 한다.
- 즉, 함수의 파라미터로 타입을 입력가능하게 함
funcion 함수명<Type작명>(){}
- 한번의 선언으로 다양한 타입에 재사용 가능
- 이때
타입 파라미터
의 작명은T
라고 작명하는 것이 관습.
function 함수<T>(x :T[]) :T {
return x[0]
}
let a = 함수<number>([4,2])
console.log(a) // <- a는 number타입, 4
a + 1 // <- 정상작동
let b = 함수<string>(['4','2']) // <- b는 string타입, '4'
function 함수<MyType> (x :MyType) {
return x - 1 // <- error (무슨 타입이 들어올지 모름)
}
function 함수명<type작명 extends 조건타입>(){}
function 함수<MyType extends number> (x :MyType) {
return x - 1 // <- 정상작동
}
type Age<T> = T extends string ? string : unknown;
let age : Age<string> //age는 string 타입
let age2 : Age<number> //age는 unknown 타입
type FirstItem<T> = T extends any[] ? T[0] : any;
let age1 :FirstItem<string[]>; // string타입
let age2 :FirstItem<number>; // any타입
조건문에서 쓸 수 있는 특별한 키워드로 타입파라미터에서 타입을 추출하는 역할
👉🏻T extends infer R
: T(타입)을 유추해서 R이라는 변수에 집어넣음
R
은 조건식 안에서 마음대로 사용가능하다.type Person<T> = T extends infer R ? R : unknown; type 새타입 = Person<string> // 새타입은 string 타입
🤔 용도1: array안에 있던 타입이 어떤 타입인지 뽑아서 변수로 만들 때
type 타입추출<T> = T extends (infer R)[] ? R : unknown;
type NewType = 타입추출< boolean[] > // NewType 은 boolean
type NewType2 = 타입추출< boolean > // NewType2는 unknown
🤔 용도2: 함수의 return 타입이 어떤 타입인지 뽑아서 변수로 만들 때
type 타입추출<T> = T extends ( ()=> infer R ) ? R : unknown;
type NewType = 타입추출< () => number > // NewType은 number 타입