TypeScript 函数

函数中的变量类型标注

function MyFn(a = 10, b?: number, c?: boolean, ...rest: number[]): number {
  //设置变量和返回值的类型,如果没有返回值使用 void,?代表设置为可选项
  return 100;
}

关于 voidnever 类型

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']);