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
객체의 Property
인 length
에 직접 접근하여 숫자를 가져오는 것도 가능하다. (다른 객체지향 언어의 Static Member Variable
을 생각하면 편할 듯 하다.)
바로 이런 경우를 type
으로 정의한게 아래와 같은 코드이다.
1
2
3
4
type DescribableFunction = {
description: string;
(someArg: number): boolean;
};
DescribableFunction
Type
은 DescribableFunction(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
객체 member
에 new
연산자만 붙여주면 해당 Type
의 클래스는 반드시 선언 된 Type
과 동일한 형태의 Constructor
를 가져야만 한다.
Vanila Javascript
에서 Class
를 사용하는건 드문 일이니 익숙하지 않을 수 있는 부분이다.