呼び出し可能オブジェクト
次のように、型またはインターフェースの一部として呼び出し可能オブジェクトにアノテーションを付けることができます
1
interface ReturnString {
2
(): string
3
}
Copied!
そのようなインターフェースのインスタンスは、例えば文字列を返す関数です。
1
declare const foo: ReturnString;
2
const bar = foo(); // bar is inferred as a string
Copied!

明白な例

もちろん、このような呼び出し可能なアノテーションは、必要に応じて引数/オプション引数/可変長引数を指定することもできます。例えばここに複雑な例があります:
1
interface Complex {
2
(foo: string, bar?: number, ...others: boolean[]): number;
3
}
Copied!
インターフェースは、複数の呼び出し可能なアノテーションを提供して、関数のオーバーロードを指定することができます。例えば:
1
interface Overloaded {
2
(foo: string): string
3
(foo: number): number
4
}
5
6
// example implementation
7
function stringOrNumber(foo: number): number;
8
function stringOrNumber(foo: string): string;
9
function stringOrNumber(foo: any): any {
10
if (typeof foo === 'number') {
11
return foo * foo;
12
} else if (typeof foo === 'string') {
13
return `hello ${foo}`;
14
}
15
}
16
17
const overloaded: Overloaded = stringOrNumber;
18
19
// example usage
20
const str = overloaded(''); // type of `str` is inferred as `string`
21
const num = overloaded(123); // type of `num` is inferred as `number`
Copied!
もちろん、インターフェースの本体のように、呼び出し可能オブジェクトのインターフェースの本体を変数の型名として使用することができます。例えば:
1
const overloaded: {
2
(foo: string): string
3
(foo: number): number
4
} = (foo: any) => foo;
Copied!

アロー構文

呼び出し可能オブジェクトのシグネチャを簡単に指定できるように、TypeScriptでは単純なアロー型アノテーションも使用できます。例えば、numberをとり、stringを返す関数は次のようにアノテーションすることができます:
1
const simple: (foo: number) => string
2
= (foo) => foo.toString();
Copied!
たった1つのアロー構文の制限: オーバーロードを指定することはできません。オーバーロードの場合、フルの{(someArgs):someReturn}構文を使用する必要があります。

ニューアブル(Newable)

ニューアブル(Newable)は、接頭辞newを持つ特殊なコーラブル型アノテーションです。これは単にnewを使って呼び出す必要があることを意味します。
1
interface CallMeWithNewToGetString {
2
new(): string
3
}
4
// Usage
5
declare const Foo: CallMeWithNewToGetString;
6
const bar = new Foo(); // bar is inferred to be of type string
Copied!