2024-05-06 20:40:05 +00:00
|
|
|
---
|
2024-10-30 17:04:36 +00:00
|
|
|
date: 20201001
|
2024-05-06 20:40:05 +00:00
|
|
|
id: afb5a8ff-045c-48f1-9b9e-e5bb55f4a572
|
|
|
|
title: TypeScript Callable
|
|
|
|
---
|
|
|
|
|
|
|
|
# Examples
|
|
|
|
|
|
|
|
## Basic
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
interface ReturnString {
|
|
|
|
(): string
|
|
|
|
}
|
|
|
|
|
|
|
|
declare const foo: ReturnString;
|
|
|
|
const bar = foo(); // bar is inferred as a string
|
|
|
|
```
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
interface Complex {
|
|
|
|
(foo: string, bar?: number, ...others: boolean[]): number;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Overloading
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
interface Overloaded {
|
|
|
|
(foo: string): string
|
|
|
|
(foo: number): number
|
|
|
|
}
|
|
|
|
|
|
|
|
// example implementation
|
|
|
|
function stringOrNumber(foo: number): number;
|
|
|
|
function stringOrNumber(foo: string): string;
|
|
|
|
function stringOrNumber(foo: any): any {
|
|
|
|
if (typeof foo === 'number') {
|
|
|
|
return foo * foo;
|
|
|
|
} else if (typeof foo === 'string') {
|
|
|
|
return `hello ${foo}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const overloaded: Overloaded = stringOrNumber;
|
|
|
|
|
|
|
|
// example usage
|
|
|
|
const str = overloaded(''); // type of `str` is inferred as `string`
|
|
|
|
const num = overloaded(123); // type of `num` is inferred as `number`
|
|
|
|
```
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
const overloaded: {
|
|
|
|
(foo: string): string
|
|
|
|
(foo: number): number
|
|
|
|
} = (foo: any) => foo;
|
|
|
|
```
|
|
|
|
|
|
|
|
## Arrow Syntax
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
const simple: (foo: number) => string
|
|
|
|
= (foo) => foo.toString();
|
|
|
|
```
|
|
|
|
|
|
|
|
## Newable
|
|
|
|
|
|
|
|
Newable is just a special type of callable type annotation with the
|
|
|
|
prefix new. It simply means that you need to invoke with new:
|
|
|
|
|
|
|
|
``` typescript
|
|
|
|
interface CallMeWithNewToGetString {
|
|
|
|
new(): string
|
|
|
|
}
|
|
|
|
// Usage
|
|
|
|
declare const Foo: CallMeWithNewToGetString;
|
|
|
|
const bar = new Foo(); // bar is inferred to be of type string
|
|
|
|
```
|