함수의 파라미터와 리턴값의 타입을 지정해주는것
예시)
type Add = (a:number,b:number)=> number
직접 작성하는것 보다 외부 라이브러리(nextjs등)에 자주 보이는 형태로, 하나의 함수가 복수의 Call Signature를 가질 때 발생한다.
매개변수의 데이터 타입이 다른 경우 예외 처리 예시
type Add2 = {
(a: number, b: number): number,
(a: number, b: number, c: number): number
}
const add2: Add2 = (a, b, c?: number) => {
if (c) return a + b + c;
return a + b;
}
매개변수의 수가 다른 경우 예외 처리 예시
type Add = {
(a:number,b:number):number;,
(a:number,b:number,c:number):number,
}
//에러가 발생하는 코드
const add:Add (a,b,c)=>{
if(c)return a+b+c
return a+b
}
에러가 발생하지 않는 코드
const add:Add (a,b,c?:number)=>{
if(c)return a+b+c
return a+b
}
위 코드의 매개변수 c의경우 옵션이기 때문에 c의 타입을 지정해주지 않게되면 에러가 발생하기 때문에 꼭 타입을 지정해주어야 한다.
여러 타입을 받아들임으로써 여러 형태를 가지는 것을 의미한다.
아래 예시처럼 여러 타입의 배열을 가지는 경우 직접 모든 Call Signature를 작성해주는 것은 효율성이 떨어지기 때문에 Generic을 사용한다.
제네릭은 placeholder의 개념과 유사하다.
데이터의 타입이 정해지지 않았을때, 해당 데이터의 임시 타입을 정의하는 것과 같다. 쉽게 얘기하자면, 아래와 같이 배열을 출력하는 함수가 있다고 가정해보면,
superPrint라는 함수의 매개변수에 들어올 데이터의 타입이 정해지지 않은경우 Call Signature를 이용해 일일히 타입을 정의하는 것은 비효율 적이기 때문에, 제네릭을 이용해 임시 타입으로 지정하는 것이다.
any와의 차이점은 해당 타입에 대한 정보를 잃지 않는다.
any는 any로서 밖에 알 수 없지만 Generic은 타입 정보를 알 수 있다.
Generic을 사용한 경우
Any를 사용한 경우
*Generic은 라이브러리를 만들거나 다른 개발자가 사용할 기능을 개발하는 경우에는 직접 작성하는 것이 유용하겠지만 그 외의 일반적인 경우에는 Generic을 직접 작성할 일은 없다고 한다.
Generic은 아래와 같이 커스텀 및 재사용이 가능하다 extraInfo의 경우 어떠한 데이터가 입력 될 수도 있고 입력되지 않을 수도 있는 옵션 이기 때문에 공통적인 type은 재사용하고 옵션인 부분은 제네릭을 이용해서 유용하게 사용할 수 있다.