TypeScript函数类型 #

一、函数类型定义 #

1.1 函数声明 #

typescript
function add(a: number, b: number): number {
    return a + b;
}

const result = add(1, 2);

1.2 函数表达式 #

typescript
const add = function(a: number, b: number): number {
    return a + b;
};

const add2 = (a: number, b: number): number => a + b;

1.3 函数类型注解 #

typescript
type Add = (a: number, b: number) => number;

const add: Add = (a, b) => a + b;

interface Calculator {
    add: (a: number, b: number) => number;
    subtract: (a: number, b: number) => number;
}

二、参数类型 #

2.1 必需参数 #

typescript
function greet(name: string): string {
    return `Hello, ${name}!`;
}

greet('Alice');
greet();

2.2 可选参数 #

使用?标记可选参数:

typescript
function greet(name: string, greeting?: string): string {
    if (greeting) {
        return `${greeting}, ${name}!`;
    }
    return `Hello, ${name}!`;
}

greet('Alice');
greet('Alice', 'Hi');

2.3 默认参数 #

typescript
function greet(name: string, greeting: string = 'Hello'): string {
    return `${greeting}, ${name}!`;
}

greet('Alice');
greet('Alice', 'Hi');

2.4 剩余参数 #

typescript
function sum(...numbers: number[]): number {
    return numbers.reduce((acc, num) => acc + num, 0);
}

sum(1, 2, 3, 4, 5);

2.5 解构参数 #

typescript
function printCoord({ x, y }: { x: number; y: number }): void {
    console.log(`(${x}, ${y})`);
}

printCoord({ x: 10, y: 20 });

interface Coord {
    x: number;
    y: number;
}

function printCoord2({ x, y }: Coord): void {
    console.log(`(${x}, ${y})`);
}

三、返回值类型 #

3.1 基本返回类型 #

typescript
function add(a: number, b: number): number {
    return a + b;
}

function greet(name: string): string {
    return `Hello, ${name}!`;
}

function log(message: string): void {
    console.log(message);
}

3.2 返回对象类型 #

typescript
function createUser(name: string, age: number): { name: string; age: number } {
    return { name, age };
}

interface User {
    name: string;
    age: number;
}

function createUser2(name: string, age: number): User {
    return { name, age };
}

3.3 返回数组类型 #

typescript
function createPair<T>(first: T, second: T): [T, T] {
    return [first, second];
}

const pair = createPair(1, 2);

3.4 返回函数类型 #

typescript
function createMultiplier(factor: number): (value: number) => number {
    return (value: number) => value * factor;
}

const double = createMultiplier(2);
console.log(double(5));

3.5 返回Promise类型 #

typescript
async function fetchData(url: string): Promise<Response> {
    return fetch(url);
}

async function getUser(id: number): Promise<User> {
    const response = await fetch(`/api/users/${id}`);
    return response.json();
}

四、函数类型别名 #

4.1 定义函数类型 #

typescript
type Callback = (data: string) => void;
type Handler = (event: Event) => void;
type Compare = (a: number, b: number) => number;

const callback: Callback = (data) => console.log(data);
const handler: Handler = (event) => console.log(event.type);
const compare: Compare = (a, b) => a - b;

4.2 接口定义函数 #

typescript
interface Add {
    (a: number, b: number): number;
}

const add: Add = (a, b) => a + b;

interface SearchFunc {
    (source: string, subString: string): boolean;
}

const search: SearchFunc = (source, subString) => {
    return source.indexOf(subString) !== -1;
};

4.3 构造签名 #

typescript
interface AnimalConstructor {
    new (name: string): Animal;
}

interface Animal {
    name: string;
}

function createAnimal(ctor: AnimalConstructor, name: string): Animal {
    return new ctor(name);
}

五、箭头函数 #

5.1 基本语法 #

typescript
const add = (a: number, b: number): number => a + b;

const greet = (name: string): string => `Hello, ${name}!`;

const log = (message: string): void => {
    console.log(message);
};

5.2 类型推断 #

typescript
const add = (a: number, b: number) => a + b;

const greet = (name: string) => `Hello, ${name}!`;

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);

5.3 this绑定 #

typescript
class Counter {
    count = 0;
    
    increment = (): void => {
        this.count++;
    };
    
    decrement(): void {
        this.count--;
    }
}

const counter = new Counter();
const increment = counter.increment;
increment();

const decrement = counter.decrement;
decrement();

六、回调函数 #

6.1 回调函数类型 #

typescript
function fetchData(callback: (data: string) => void): void {
    setTimeout(() => {
        callback('Data loaded');
    }, 1000);
}

fetchData((data) => {
    console.log(data);
});

6.2 错误优先回调 #

typescript
type AsyncCallback = (error: Error | null, data?: string) => void;

function fetchData(callback: AsyncCallback): void {
    setTimeout(() => {
        callback(null, 'Data loaded');
    }, 1000);
}

fetchData((error, data) => {
    if (error) {
        console.error(error);
    } else {
        console.log(data);
    }
});

6.3 Promise替代 #

typescript
function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Data loaded');
        }, 1000);
    });
}

async function main(): Promise<void> {
    const data = await fetchData();
    console.log(data);
}

七、函数重载 #

7.1 基本重载 #

typescript
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
    return a + b;
}

const num = add(1, 2);
const str = add('hello', 'world');

7.2 不同参数数量 #

typescript
function createElement(tag: 'a'): HTMLAnchorElement;
function createElement(tag: 'canvas'): HTMLCanvasElement;
function createElement(tag: string): HTMLElement {
    return document.createElement(tag);
}

const anchor = createElement('a');
const canvas = createElement('canvas');

7.3 重载与联合类型 #

typescript
function format(value: string): string;
function format(value: number): string;
function format(value: string | number): string {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value.toFixed(2);
}

7.4 实际应用 #

typescript
interface User {
    id: number;
    name: string;
}

function getUser(): User[];
function getUser(id: number): User;
function getUser(id?: number): User | User[] {
    if (id === undefined) {
        return [
            { id: 1, name: 'Alice' },
            { id: 2, name: 'Bob' }
        ];
    }
    return { id, name: 'User' };
}

const users = getUser();
const user = getUser(1);

八、泛型函数 #

8.1 基本泛型函数 #

typescript
function identity<T>(arg: T): T {
    return arg;
}

const str = identity<string>('hello');
const num = identity(123);

8.2 泛型约束 #

typescript
interface Lengthwise {
    length: number;
}

function logLength<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);
    return arg;
}

logLength('hello');
logLength([1, 2, 3]);
logLength({ length: 10 });
logLength(123);

8.3 多类型参数 #

typescript
function pair<K, V>(key: K, value: V): [K, V] {
    return [key, value];
}

const p1 = pair('name', 'Alice');
const p2 = pair(1, 'first');

8.4 泛型默认值 #

typescript
function createArray<T = string>(length: number, value: T): T[] {
    return Array(length).fill(value);
}

const arr1 = createArray(3, 'x');
const arr2 = createArray<number>(3, 1);

九、实用示例 #

9.1 防抖函数 #

typescript
function debounce<T extends (...args: any[]) => any>(
    func: T,
    wait: number
): (...args: Parameters<T>) => void {
    let timeout: ReturnType<typeof setTimeout> | null = null;
    
    return function(this: any, ...args: Parameters<T>): void {
        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(() => {
            func.apply(this, args);
        }, wait);
    };
}

9.2 节流函数 #

typescript
function throttle<T extends (...args: any[]) => any>(
    func: T,
    limit: number
): (...args: Parameters<T>) => void {
    let inThrottle = false;
    
    return function(this: any, ...args: Parameters<T>): void {
        if (!inThrottle) {
            func.apply(this, args);
            inThrottle = true;
            setTimeout(() => {
                inThrottle = false;
            }, limit);
        }
    };
}

9.3 柯里化函数 #

typescript
function curry<T extends (...args: any[]) => any>(fn: T): (...args: any[]) => any {
    return function curried(...args: any[]): any {
        if (args.length >= fn.length) {
            return fn(...args);
        }
        return (...moreArgs: any[]) => curried(...args, ...moreArgs);
    };
}

const add = (a: number, b: number, c: number) => a + b + c;
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3));
console.log(curriedAdd(1, 2)(3));
console.log(curriedAdd(1)(2, 3));

十、总结 #

本章介绍了TypeScript函数类型:

函数类型定义 #

  1. 函数声明和函数表达式
  2. 参数类型:必需、可选、默认、剩余参数
  3. 返回值类型
  4. 函数类型别名

高级特性 #

  1. 箭头函数
  2. 回调函数
  3. 函数重载
  4. 泛型函数

最佳实践 #

  1. 显式注解函数参数和返回值类型
  2. 合理使用可选参数和默认参数
  3. 使用函数重载提供更好的类型推断
  4. 使用泛型提高函数复用性
最后更新:2026-03-26