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函数类型:
函数类型定义 #
- 函数声明和函数表达式
- 参数类型:必需、可选、默认、剩余参数
- 返回值类型
- 函数类型别名
高级特性 #
- 箭头函数
- 回调函数
- 函数重载
- 泛型函数
最佳实践 #
- 显式注解函数参数和返回值类型
- 合理使用可选参数和默认参数
- 使用函数重载提供更好的类型推断
- 使用泛型提高函数复用性
最后更新:2026-03-26