타입스크립트 - 함수
@function
call signature
- 함수 위에 마우스를 올렸을 때 보게 되는 것
- 함수의 인자 타입/ 반환타입을 알려줌
1
2
3
type Add = (a: number, b: number) => number;
const add: Add = (a, b) => a + b;
@오버로딩 overloading
- 함수가 서로 다른 여러개의 call signatures를 가지고 있을 때 발생
- string을 보내거나 config 객체를 보내는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type Config = {
path: string,
state: object
}
// overloading
type Push = {
(path:string): void
(config: Config): void
}
const push:Push = (config)=>{
if(typeod config === 'string'){
console.log(config)
}
else{
console.log(config.path, config.state)
}
}
- 여러개의 인자를 가지고 있는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Add = {
(a:number, b:number): number
(a:number, b:number, c:number): number
}
// c: option (추가 파라미터 옵션)
const add:Add =(a,b,c?:number) => {
if(c) return a + b + c
return a+ b
}
//Error! 파라미터의 개수가 다르기때문
const add:Add =(a,b,c) => {
return a+ b
}
@제네릭 generics
- 콘크리트 타입을 사용하는 것 대신 사용할 수 있음
- 콘트리트 타입: number, string, boolean 등
- 타입의 placeholder 같은 것
- 타입을 유추
- call signature를 작성하는데 콘크리트 타입을 알 수 없을 때 사용
- 사용방법
1
2
3
4
5
6
7
8
9
10
11
12
13
// call signature
type Typename = {
<GenericName>(arg: GenericName): void,
<T,M>(a:T, b:M)=>T
};
const superPrint: SuperPrint = (arr) => arr[0];
// 함수형
// V: generic
function superPrint<V>(a:V[]){
return a[0]
}
예시1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type Player<Extra> = {
name: string
extranInfo: Extra
}
type MarkExtra = Player<{favFood:string}>
const mark: MarkExtra = {
name: mark,
extraInfo: {
favFood: 'watermelon'
}
}
const nico: Player<null> = {
name: nico,
extraInfo: null
}
예시2
1
2
3
4
5
6
7
type A = Array<number>;
let a: A = [1, 2, 3];
function printAllNumbers(arr: Array<number>) {
return;
}
@다향성 polymorphism
- call signature을 하나하나 만들어서 다양한 형태를 받음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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])
superPrint([true, false, true])
superPrint(['a', 'b', 'c'])
// Error!
superPrint([1, 2, true, 'c'])
Generic을 사용해 다양한 형태를 받기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type SuperPrint = {
<GenericType>(arr: GenericType[]): GenericType
};
const superPrint: SuperPrint = (arr) => arr[0];
const a = superPrint([1, 2, 3]);
// a: number
const b = superPrint([true, false, true]);
// b: boolean
const c = superPrint(["a", "b", "c"]);
// c: string
const d = superPrint([1, 2, true, "c"]);
// d: number | boolean | string
This post is licensed under CC BY 4.0 by the author.