제네릭 형식이란 무엇입니까?
제네릭은 어떤 유형이 해당 유형에 들어갈지 확실히 모를 때 호출 서명을 작성할 때 사용됩니다.
유형 슈퍼프린트 = {
<티>(알: 티()):무효의
}
const 슈퍼프린트:슈퍼프린트 = (알) =>{
알.각각(나 =>콘솔.통나무(나))
}
슈퍼프린트((1,2,삼,4))
슈퍼프린트((진실,거짓,진실,진실))
슈퍼프린트((“asdf”,“비”,“씨”))
슈퍼프린트((1,2,진실,거짓))
<> 안에 넣으면 제네릭 타입이 됩니다.
안에 이름을 쓸 수 있습니다.
제네릭은 유형을 수신할 때 TypeScript에 의해 자동으로 유추됩니다.
이것이 다형성 유형을 지정하는 방법입니다.
예.
유형 슈퍼프린트 = {
<티>(알: 티()):티
}
const 슈퍼프린트:슈퍼프린트 = (알) => 알(0)
const ㅏ = 슈퍼프린트((1,2,삼,4))
const 비 = 슈퍼프린트((진실,거짓,진실,진실))
const 씨 = 슈퍼프린트((“asdf”,“비”,“씨”))
const 디 = 슈퍼프린트((1,2,진실,거짓,“홍대”))
React에서 사용하는 경우 위와 다르게 사용됩니다.
여러 제네릭을 사용하는 경우
유형 슈퍼프린트 = {
<티,중>(ㅏ:티(), 비:중):티
}
const 슈퍼프린트:슈퍼프린트 = (ㅏ) => ㅏ(0)
const ㅏ = 슈퍼프린트((1,2,삼,4),“엑스”)
const 비 = 슈퍼프린트((진실,거짓,진실,진실),1)
const 씨 = 슈퍼프린트((“asdf”,“비”,“씨”), 거짓)
const 디 = 슈퍼프린트((1,2,진실,거짓,“홍대”),())
# 부가 설명
그렇다면 그냥 any를 넣는 것과 Generic의 차이는 무엇일까?
type SuperPrint = {
(arr: any()): any
}
const superPrint: SuperPrint = (arr) => arr(0)
let a = superPrint((1, "b", true));
// pass
a.toUpperCase();
any를 사용하면 위와 같은 경우에도 에러가 발생하지 않는다
type SuperPrint = {
(arr: T()): T
}
const superPrint: SuperPrint = (arr) => arr(0)
let a = superPrint((1, "b", true));
// error
a.toUpperCase();
Generic의 경우 에러가 발생해 보호받을 수 있다
* Call Signature를 concrete type으로 하나씩 추가하는 형태이기 때문!
type SuperPrint = {
(arr: T(), x: M): T
}
const superPrint: SuperPrint = (arr, x) => arr(0)
let a = superPrint((1, "b", true), "hi");
위와 같이 복수의 Generic을 선언해 사용할 수 있다