跳至主要內容

函数类型

Mr.He大约 1 分钟

函数类型

函数类型定义

直接定义

定义包括对参数和返回值的类型定义

function add(arg1: number, arg2: number): number {
  return x + y;
}
const add = (arg1: number, arg2: number): number => {
  return x + y;
};

下面来定义一个完整的函数类型,以及用这个函数类型来规定一个函数定义时参数和返回值需要符合的类型。

let add: (x: number, y: number) => number;
add = (arg1: number, arg2: number): number => arg1 + arg2;
add = (arg1: string, arg2: string): string => arg1 + arg2; // error

接口定义

interface Add {
  (x: number, y: number): number;
}
let add: Add = (arg1: string, arg2: string): string => arg1 + arg2;
// error 不能将类型“(arg1: string, arg2: string) => string”分配给类型“Add”

类型别名定义

type Add = (x: number, y: number) => number;
let add: Add = (arg1: string, arg2: string): string => arg1 + arg2;
// error 不能将类型“(arg1: string, arg2: string) => string”分配给类型“Add”

函数重载

TypeScript 中有的函数重载并不是定义几个同名实体函数,然后根据不同的参数个数或类型来自动调用相应的函数。 而是在类型系统层面的,是为了更好地进行类型推断。 TypeScript 的函数重载通过为一个函数指定多个函数类型定义,从而对函数调用的返回值进行检查:

// 重载签名
function handleData(x: string): number;
function handleData(x: number): string;
function handleData(x: null): number;
// 实际实现
function handleData(x: string | number | null | boolean): number | string {
  if (typeof x === "string") {
    return Number(x);
  }
  if (typeof x === "number") {
    return String(x);
  }
  return -1;
}

// 测试调用
console.log(handleData(996)); // 输出: "996"
console.log(handleData("996")); // 输出: 996
console.log(handleData(null)); // 输出: -1
console.log(handleData(false)); // error