[Typescript] 03. 시그니처
포스트
취소

[Typescript] 03. 시그니처

1
2
3
4
5
6
7
type DescribableFunction = {
  description: string;
  (someArg: number): boolean;
};
function doSomething(fn: DescribableFunction) {
  console.log(fn.description + " returned " + fn(6));
}

위 예제는 처음 봤을 때 뭔 소린가 싶었는데, 해석 된 글을 보고 이해한 것을 바탕으로 쉽게 풀어보겠다.
Javascript의 객체들은 Property를 가질 수 있다. 예를 들어보자.

1
2
const text = String("text"); // "text"
const defaultStringLength = String.length; // 1

String객체는 String 자체를 함수 형태로 사용하는게 가능하지만, String객체의 Propertylength에 직접 접근하여 숫자를 가져오는 것도 가능하다. (다른 객체지향 언어의 Static Member Variable을 생각하면 편할 듯 하다.)
바로 이런 경우를 type으로 정의한게 아래와 같은 코드이다.

1
2
3
4
type DescribableFunction = {
  description: string;
  (someArg: number): boolean;
};

DescribableFunction TypeDescribableFunction(123) 이러한 형태로 사용하는 것도 가능하지만, DescribableFunction.description 형태로 사용하는 것도 가능한 구조라는 얘기이다.

Construct Signatures

위 섹션을 봤다면 본 섹션은 어렵지 않게 이해할 수 있을 것이다.
Type은 생성자의 규칙마저도 선언이 가능하다.

1
2
3
4
5
6
type SomeConstructor = {
  new (s: string): SomeObject;
};
function fn(ctor: SomeConstructor) {
  return new ctor("hello");
}

Type 객체 membernew 연산자만 붙여주면 해당 Type의 클래스는 반드시 선언 된 Type과 동일한 형태의 Constructor를 가져야만 한다.
Vanila Javascript에서 Class를 사용하는건 드문 일이니 익숙하지 않을 수 있는 부분이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.