Trip to TypeScript
[하루만에 정복해보는 TS] Call signature와 Overloading 그리고 최종보스 Generic
Kestrel
2023. 5. 31. 09:02
사실 지금부터가 본격적인 내용이다. Call signature은 바로 아래와 같이 type을 알려주는 팝업 창이다.
참고로 void는 아무것도 return하지 않는다는 것이다. 실제로 함수에서 return이 사용되지 않은 모습이다. 이런 콜스택이 여러개 있을 때 Overloading 이라고 한다. 딱히 내용은 없지만 알고는 있어야한다.
type SuperPrint = {
(arr: number[]): void
(arr:boolean[]): void
(arr: string[]): void
}
const superPrint: SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
superPrint([1, 2, 3, 4])
superPrint([true, false, true])
superPrint(["a", "b", "c"])
superPrint([1, 2, true, false])???
제네릭은 진짜 내가 이해를 못했던 부분이라 노마드코더의 예시와 논리를 가져왔다. 이것은 왜 제네릭이 필요한지에 대한 반례이다. 여러가지 타입을 사용하고 싶다면 우리는 type에 계속 type값을 추가 해야할까? 그렇게 한다면 무궁무진한 조합을 모두 Call signature에 작성해야할 것 같다. 그래서 제네릭이 필요하다. 결론적으로 제네릭은 Call signature에 어떤 타입을 넣어야할지 확실하지 않을 때 generic을 사용한다.
type SuperPrint = {
<TypePlaceholder>(arr: TypePlaceholder[]):void
}
const superPrint: SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
superPrint([1, 2, 3, 4])
superPrint([true, false, true])
superPrint(["a", "b", "c"])
superPrint([1, 2, true, false])
위의 예시처럼 <>로 제네릭을 선언하고 어디에 제네릭을 써야할지 써준다. 예시는 배열의 값들이 제네릭이라는 것을 말해주고 있다. 그래서 결론적으로 아래 superPrint에 들어가는 매개변수 값들은 에러에서 벗어날 수 있다. <>안에 들어가는 이름은 아무거나 해줘도 되지만 관례상 T, V를 많이 쓴다고 한다.