타입스크립트의 콜시그니쳐 / 오버로딩 / 인덱스 시그니쳐

콜시그니쳐(vue3의 computed의 콜시그니쳐)

1.콜시그니쳐

vscode등에서 함수 위에 커서를 올리면 나오는 파라미터와 리턴 타입 정보를 말한다

type Add = (a: number, b: number) => number // 콜시그니쳐 정의
const add: Add = (a,b) => a+b // 함수정의(함수내용정의)
const result:number = add(1,2) // 함수호출(반환형의 타입정의까지)

2.오버로딩

매개 변수만 다른 여러 함수타입을 정의하는것

type Add = {
  (a: number, b: number): number;
  (a: number, b: string): number;
};
 
const add: Add = (a, b) => {
  if (typeof b === "string") return a;
  return a + b;
};

3.제네릭과 타입추론

아래의 예제에서 타입추론을 확인가능하다

실제로 외부라이브러리에서 많이 쓰이는 패턴

// 1.콜시그니쳐 작성
type SuperPrint = {
    <T>(arr: T[]):T  
    <T>(arr: T[],arr1: M[]):T
    // 0.함수오버로딩부분
    // 위의 두 오버로딩의 참조해서 아래의 함수를 호출할수있는 함수타입 제공
    // SuperPrint(T)
    // SuperPrint(T,M)
}

// 2. 함수 선언 (함수 내용 작성) 
// 오버로딩된 함수에 매개변수가 많을 경우 optional처리 (?)를 해주어야 에러가 안난다
const superPrint: SuperPrint = <T, M>(arr: T[], arr1?: M[]): T => arr[0] 

// 3,함수호출
const i = superPrint([1, 2, 3, 4]) // *** 매개변수에 V에 해당하는 number의 배열을 넣으면 제네릭 T를 타입추론해서 반환형도 T라는걸 알수있다
const j = superPrint([true, false, true])
const k = superPrint(["a", "b", "c"])
const l = superPrint([1, 2, true, false, "hello"])

4-1. 실제 사용 사례

*주의 할점이 콜시그니쳐의 오버로딩의 형식이 인터페이스이다

콜시그니쳐1.실제로 vue3의 computed를 사용시 computed까지 적으면 위와같은 콜시그니쳐가 표시된다

2.computed에 오버로딩된 함수가 정의되어있다

3.그러면 computed() 가 된다는건 일단 알수있으므로 입력한다

4.computed()가 입력되고 마우스 커서를 올리면 실제로 아래와 같이 사용된다고 함수상세내용이 표시되므로 참조해서 사용하면된다

5. 자주 헷갈리는것

type computed = {} 처럼 = 를 사용하면 콜시그니쳐 선언

const computed : {} 처럼 : 를 사용하면 콜시그니쳐 타입을 사용해서 함수선언

그러므로 위의 예제라면 computed()로 사용된다


콜시그니쳐2

4-2. 실제 사용 사례

스테이트실제로 useState도 위와같은 콜시그니쳐다

그러므로 아래와 같은 두가지 패턴을 사용가능하다

useStat(key,init)

useStat(init)



4-3 실제사용사례에 대한 추가 설명

앞선 사례들을 설명은 type으로 콜시그니쳐의 오버로딩을 정의했지만

실제로 사용한 예제는 아래처럼 인터페이스의 형태의 콜시그니쳐를 사용함을 알수있다

interface NormalCS {
    (arg1: string, arg2: number): number;
}

//일반 함수
const InterfaceFunction: NormalCS = function (arg1, arg2) {return arg2;};

//화살표 함수
const InterfaceArrow: NormalCS = (arg1, arg2) => arg2;
// Computed를 예로 들면 아래와 같을까
interface Computed {
    (arg1: string, arg2: number): number;
}

const computed: Computed = (arg1, arg2) => arg2;


5. Index Signature

인덱스 시그니쳐는 속성에 타입을 선언하는 구문과 유사하지만 한 가지 차이점이 존재한다. 속성 이름 대신 대괄호 안에 key타입을 작성하는 것이다.

  • key와 value의 타입이 string인 경우

type userType = {
	[key : string] : string
}

let user : userType = {
	'마이콜':'사람'
  	'또치':'타조'
}
  • key의 타입은 string, value는 string, number, boolean

type userType = {
  [key: string]: string | number | boolean;
}

let user : userType = {
	'이름' : '또치'
  	'나이' : 38
  	'여자' : true
}

참조

노마드코더

인터페이스형식 콜시그니쳐

인덱스시그니쳐

Nov 19, 2023 Views 99