Photo by Mathilde Normandeau on Unsplash
그리스어: poly
many : several : much : multi-
polygon(다각형) : poly 많은 + gon 각도
morpho-
"form, structure"
many(poly) structure(morphos)
여러가지 다른 구조들
ex) 여태까지 경험해본 다형성들
type SuperPrint = {
(arr: number[]):void
}
type SuperPrint = {
(arr: number[]):void
}
const superPrint: SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
type SuperPrint = {
(arr: number[]):void
}
const superPrint: SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
type SuperPrint = {
(arr: number[]):void
(arr: boolean[]):void
}
const superPrint: SuperPrint = (arr) => {
arr.forEach(i => console.log(i))
}
superPrint([1,2,3,4])
superPrint([true,true,false])
superPrint(["a","b","c"])
(arr: string[]):void
를 작성해야 하는가? -> 다른 방법이 있음 -> 다형성 활용(arr: number[]):void
(arr: boolean[]):void
(arr: string[]):void
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,true,false])
superPrint(["a","b","c"])
superPrint([1, 2, true, false])
이런식으로 받으려하면 오버로드가 없기때문에 작동 안됨타입과 상관없이 배열을 받고, 배열의 요소를 하나씩 print 해주는 함수
를 작성하려면?type SuperPrint = {
(arr: number[]):void
(arr: boolean[]):void
(arr: string[]):void
(arr: (number | boolean)[]):void
}
이런식으로 작성한다면 가능성을 모두 조합해야하기 때문에 힘듦
call signature를 작성할때, call signiture안에 들어올 타입이 여러가지이지만 뭐가 올지 모를때
함수를 작성할때는 concrete type을 이용해야겠지만 call signature를 작성할때는 concrete type이 무엇이 올지 모를경우가 있음
이런 경우에 generic 사용
<TypePlaceholder>
로 사용type SuperPrint = {
<TypePlaceholder>(arr: number[]):void
}
type SuperPrint = {
<TypePlaceholder>(arr: TypePlaceholder[]):void
}
여기서 TS는 superPrint안의 [1,2,3,4]
값을 PlaceHolder로 보고 유추해서 숫자배열로 이루어진 call signature 라는 결론을 내림
Placeholder 대신 타입스크립트가 발견한 타입으로 바꿔줌
이런 복잡한 값도 call signature를 따로 작성하지 않고 편하게 작업할 수 있음
제네릭은 여전히 함수에 타입을 입력하는걸 허용
const superPrint: SuperPrint = (arr) => arr[0];
type SuperPrint = {
<TypePlaceholder>(arr: TypePlaceholder[]):TypePlaceholder
}
const a = superPrint([1,2,3,4])
const b = superPrint([true,true,false])
const c = superPrint(["a","b","c"])
const d = superPrint([1,"ab",true,"123"])
type SuperType = {
<T>(arr: T[]):T
}