在TypeScript中,函数类型(Function Types)是一个强大的特性,它允许你以类型安全的方式定义函数的形状,包括其参数的类型和返回值的类型。这不仅可以防止在函数调用时传入错误类型的参数,还可以确保函数返回正确类型的值,从而增强代码的可读性和可维护性。
定义函数类型
你可以通过类型别名(Type Aliases)或接口(Interfaces)来定义函数类型。这里我们主要关注类型别名的方式,因为它更直接且常用于函数类型的定义。
使用类型别名定义函数类型
typescript
// 定义一个函数类型,它接受一个string类型的参数并返回一个number类型的值
type StringToNumber = (s: string) => number;
// 使用这个类型别名定义一个函数
const strLength: StringToNumber = (s: string) => s.length; // 注意:这里实际上返回的是number,但表示字符串长度的方式有误,仅用于演示
// 更正为返回数字类型的例子
const stringToNumber: StringToNumber = (s: string) => parseInt(s, 10);
// 尝试使用错误类型的参数调用stringToNumber函数(TypeScript编译器会报错)
// const result = stringToNumber(true); // Type 'boolean' is not assignable to type 'string'.
// 调用函数
const result = stringToNumber("123"); // 正确,result类型为number
可选参数和剩余参数
函数类型也可以包含可选参数和剩余参数,来支持更灵活的函数签名。
typescript
type OptionalAndRestParams = (a: number, b?: number, ...c: number[]) => number;
const sum: OptionalAndRestParams = (a, b = 0, ...c) => {
return a + (b || 0) + c.reduce((acc, curr) => acc + curr, 0);
};
const result = sum(1, 2, 3, 4); // 正确,result类型为number
函数重载
TypeScript还支持函数重载,这允许一个函数根据传入的参数数量或类型以不同的方式被调用。
typescript
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
const num = reverse(123); // 正确,num类型为number
const str = reverse("hello"); // 正确,str类型为string
结论
通过定义函数类型,TypeScript提供了强大的类型系统来确保函数的参数和返回值符合预期,从而提高了代码的类型安全性和可读性。函数类型、可选参数、剩余参数以及函数重载等特性,使得TypeScript成为开发大型、复杂应用时的理想选择。