TypeScript-4.函數

筆記。

// 一、函數類型
// 1.爲函數定義類型
// 函數傳統寫法
function add1(arg1: number, arg2: number): number {
  return arg1 + arg2
}
// 函數ES6箭頭函數
const add2 = (arg1: number, arg2: number) => arg1 + arg2
// ******類型定義********
const arg3 = 5
let add3: (x: number, y: number) => number // 定義, 常量不用定義
add3 = (arg1: number, arg2: number): number => arg1 + arg2 + arg3 // 使用

// 2.使用接口定義函數類型
interface Add {
  (num1: number, num2: number): number // tslint 推薦用下面的類型別名
}

// 3.使用類型別名
type Add2 = (num1: number, num2: number) => number
type isString = string

// 二、參數
// 1.可選參數 (?可選參數 需要寫在其他參數的後面)
type AddFunc2 = (arg1: number, arg2: number, arg3?: number) => number
let addFunc1: AddFunc2
addFunc1 = (x: number, y: number ) => x + y
addFunc1 = (x: number, y: number, z ) => x + y + (z ? z : 0)

// 2.默認參數
// 以前js寫法 先判斷
let addFunc2 = (x: number, y: number) => {
  y = y || 0
}
// 現在 語法糖 ES6也有
let addFunc3 = (x: number, y: number = 0) => x + y
addFunc3 = (x: number, y = 0) => x + y // 可不寫類型,ts會根據默認值判斷出類型

// 3.剩餘參數
// ES6之前的js
function handleData() {
  if(arguments.length === 1) return arguments[0] * 2
  else if(arguments.length === 2) return arguments[0] * arguments[1]
  // ***** Array.prototype.slice.apply(arguments)
  // arguments是類數組對象 通過這個方法轉化爲數組 類數組對象參照另一篇
  // 類數組對象理解 ????????????
  else return Array.prototype.slice.apply(arguments).join('_')
}
// ES6
const handleData1 = (...args: any) => { console.log(args) }
// TS中
const handleData2 = (arg1: number, ...args: number[]) => {
  // ...
}

// 三、重載 (只能用function定義 不能用接口定義)
function handleData3(x: string): string[]
function handleData3(x: number): number[]
function handleData3(x: any): any { // 函數實體 不是重載的一部分
  if (typeof x === 'string') {
    return x.split('')
  } else {
    return x.toString().split('').map((item: string) => Number(item))
  }
}
handleData3('abc') // 移到函數名上看類型
handleData3(666)

題外話:前幾天《人文通識》聽到木心先生,《從前慢》的作者,搜了一下,看到了一句話

意大利全靠一個太陽 我全靠一個你

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章