筆記。
// 一、函數類型
// 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)
題外話:前幾天《人文通識》聽到木心先生,《從前慢》的作者,搜了一下,看到了一句話
意大利全靠一個太陽 我全靠一個你