- call signatures
- 객체 구현시 Type Alias로 코드를 줄였던 것 처럼 call signatures로 함수 의 파라미터와 리턴값에 타입을 설정한다.
- call signatures를 활용하면 구현 코드와 타입 설정 코드를 분리할 수 있다.
1 2 3
type Add = ( a : number , b : number) => number; const add : Add = (a,b) => a + b
- overloading
- 함수가 여러개의 call signatures를 가지고 있을 때 발생한다.
- call signature들의 파라미터의 개수가 다를때 여분의 파라미터는 optional이다.
1 2 3 4 5 6 7 8 9 10 11
type Add = { (a : number, b : number) : number (a : number, b : number, c: number) : number } const add : Add = (a,b,c?:number) => { if(c) return a + b + c return a + b } //여분의 파라미터 c 의 타입이 number일 것이라고 작성해야함
- polymorphism
- Generic은 모든 타입의 변수를 받는다.
- call signatures에서는 직접 타입을 입력했지만 Generic을 사용하면 타입을 직접 입력할 필요가 없다. TS가 알아서 할당된 변수에 맞는 call signature를 생성해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
type SuperPrint ={ <TypePlaceholder>( arr: TypePlaceholder[] ) : void } //모든 변수를 입력하기 위해 모든 타입을 나열할 필요가 없다. //TypePlaceholder라는 Generic을 입력해 모든 타입 조합을 대신한다. //보통 T 를 사용한다. const superPrint : SuperPrint = (arr) => { arr.forEach( i => console.log(i) ) } superPrint([1,2,3,4]) superPrint([true, false]) superPrint([1,2,"hello","bye"]) superPrint([1,2,true, "hello"]) //TS가 배열의 요소들이 어떤 타입인지 알아서 판단한다.
- any가 Generic을 대신해도 에러는 나지 않지만 각 배열의 요소 타입이 모두 any가 된다.
- Generic은 요구한대로 signature를 생성해주는 도구와 같다.
- 파라미터가 여러개인 경우, 파라미터들을 Generic으로 설정하고 싶으면 파라미터의 개수만큼 Generic을 명시하면 된다.
1 2
type SuperPrint = < T, M >( arr : T[], b : M ) => T
[TS] Typescript의 함수
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.