TypeScript 函数
函数中的变量类型标注
function MyFn(a = 10, b?: number, c?: boolean, ...rest: number[]): number {
//设置变量和返回值的类型,如果没有返回值使用 void,?代表设置为可选项
return 100;
}
void
和 never
类型
关于 void
: • 表示函数没有返回值。使用 void
的函数可以正常结束,在函数没有返回值时隐式返回的 undefined
。 • 常用于那些没有返回值的函数,并且该函数结束时可以在正常情况下退出。
never
: • 表示函数永远不会有返回值。通常用于那些永远不会正常结束的函数,比如抛出异常或进入无限循环。 • 使用 never
的函数可以让 TypeScript 知道,该函数不会返回到调用它的地方。
let afA: void = undefined;
function run(): void {
return undefined
}
function afB(): never {
throw new Error('类型错误');
}
函数重载
为了在调用函数的时候,更好的显示可能的变量组合。
直接声明函数的函数重载
function overloadExample(x: number, y: number): number;
function overloadExample(x: string, y: string): string;
function overloadExample(x: any, y: any): any {
if (typeof x === "number" && typeof y === "number") {
return x + y; // 数字相加
} else if (typeof x === "string" && typeof y === "string") {
return x + ' ' + y; // 字符串连接
}
throw new Error("Invalid arguments");
}
对象中函数的函数重载(涉及到接口的知识)
interface Utils {
overloadExample: {
(a: number, b: number): number;
(a: string, b: string): string;
};
}
const utils: Utils = {
overloadExample(x: any, y: any): any {
if (typeof x === 'number' && typeof y === 'number') {
return x + y; // 数字相加
} else if (typeof x === 'string' && typeof y === 'string') {
return x + ' ' + y; // 字符串连接
}
throw new Error('Invalid arguments');
},
};
泛型函数
function myFnA<T>(a: T, b: T): T[] {
return [a, b];
}
function myFnB<T, U>(a: T, b: U): (T | U)[] {
return [a, b];
}
function myFnC<T extends string | any[]>(arg: T): number {
return arg.length;
}
function myFnD<T>(arg: T[]): number {
return arg.length;
}
myFnA<number>(22, 33);
myFnD<string>(['aa', 'bb']);