ts - 重载

简介: 重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。

重载

重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。

比如,我们需要实现一个函数 reverse,输入数字 123 的时候,输出反转的数字 321,输入字符串 'hello' 的时候,输出反转的字符串 'olleh'

利用联合类型,我们可以这么实现:

function reverse(x: number | string): number | string {
   
  if (typeof x === 'number') {
   
  return Number(x.toString().split('').reverse().join(''))
  } else {
   
  return x.split('').reverse().join('')
  }
}

然而这样有一个缺点,就是不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。

这时,我们可以使用重载定义多个 reverse 的函数类型:

// function reverse(x: number | string): number | string {
   
//   if (typeof x === 'number') {
   
//   return Number(x.toString().split('').reverse().join(''))
//   } else {
   
//   return x.split('').reverse().join('')
//   }
// }

// 重复定义了多次函数 `reverse`,前几次都是函数定义,最后一次是函数实现
// 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 {
   
//   return x.split('').reverse().join('')
//   }
// }

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 {
   
  return x.split('').reverse().join('')
  }
}

上例中,我们重复定义了多次函数 reverse,前几次都是函数定义,最后一次是函数实现。在编辑器的代码提示中,可以正确的看到前两个提示。

注意,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。

// 如果要给某一个位置添加 对象的类型, 使用接口去解决文通
interface IUser {
    // 实际上就相当于你自己定义了一个数据类型
  firstName?: string; // 结尾 可以 什么也不写,也可以写为 , 还可以写为;
  lastName?: string;
}

// // user 是一个对象 需要通过 接口 来定义对象的数据类型
// function greeter1 (user: IUser): string {
   
//   return 'hello' + user.firstName + ' ' + user.lastName
// }


// function greeter1 (user: { firstName: string, lastName: string }): string {
   
//   return 'hello' + user.firstName + ' ' + user.lastName
// }


// const greeter1: (user: IUser) => string  = (user: IUser): string => {
   
//   return 'hello' + user.firstName + ' ' + user.lastName
// }
// console.log(greeter1({ firstName: '吴', lastName: '大勋'}))


// 用接口定义函数的形状
interface IFn {
   
  (user: IUser): string
}
const greeter1: IFn  = (user: IUser): string => {
   
  return 'hello' + user.firstName + ' ' + user.lastName
}
console.log(greeter1({
    firstName: '吴', lastName: '大勋'}))

// 参数默认值
function test (a: number, b: number = 10): number {
   
  return a + b
}

// 重载允许一个函数接受不同数量或类型的参数时,作出不同的处理  
// 利用联合类型 number | string
// function reverse (x: number | string): number | string {
   
//   if (typeof x === 'number') {
   
//     return Number(x.toString().split('').reverse().join(''))
//   } else {
   
//     return x.split('').reverse().join()
//   }
// }

// 上述不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。
// 使用重载定义多个 `reverse` 的函数类型
// 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 {
   
    return x.split('').reverse().join()
  }
}
相关文章
|
7月前
|
存储 JavaScript 算法
TS泛型类型
TS泛型类型
68 0
|
JavaScript
对TS里泛型的理解
对TS里泛型的理解
79 1
|
JavaScript 前端开发 开发者
ts详解以及相关例子(一篇带你详细了解ts)
ts详解以及相关例子(一篇带你详细了解ts)
179 1
|
7月前
TS - 函数重载的理解:
TS - 函数重载的理解:
105 0
|
JavaScript
ts中枚举
ts中枚举
62 0
ts - 泛型
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
|
JavaScript 前端开发
ts - 类
TypeScript支持JavaScript的新特性,比如支持基于类的面向对象编程。让我们创建一个Student类,它带有一个构造函数和一些公共字段。 注意类和接口可以一起工作。
|
JavaScript 前端开发
ts -函数的类型
在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression)
|
JavaScript
TS基本语法 TS中的泛型
TS基本语法 TS中的泛型