上篇文章提到過ts變量類型的聲明,本篇將介紹ts中函數(shù)類型的聲明。
ts基礎(chǔ)環(huán)境搭建可參考上一篇文章:“TypeScript入門---變量聲明”
http://www.itdecent.cn/p/43096fa5902e
1.首先在ts中聲明函數(shù)最基本的兩種方式:
function sum(x: number, y: number) {
return x + y
}
sum(3, 4) //接收參數(shù)類型只能是數(shù)字,否則報(bào)錯(cuò)
let mySum = function(x: number | string, y: number | string) {
x = Number(x); //上方參數(shù)類型添加了字符串類型,必須在內(nèi)部進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換處理。
y = Number(y);
return x + y //若不處理,則不可以使用“+”運(yùn)算符,number和string類型混用運(yùn)算符會(huì)報(bào)錯(cuò)。
}
mySum('1', 2) //可接收number和string兩種類型的參數(shù)。
2.我們也可以在聲明函數(shù)的同時(shí)規(guī)定函數(shù)的返回值
//在聲明函數(shù)的同時(shí)聲明參數(shù)類型和函數(shù)返回值類型
let mySum = function(x:number | string, y:number | string):number {
x = Number(x);
y = Number(y);
return x + y
}
//或在聲明前添加泛式定義
let mySum: (x:number | string, y:number | string) => number = function(x, y) {
x = Number(x);
y = Number(y);
return x + y
}
3.在實(shí)際運(yùn)用當(dāng)中有時(shí)候某種泛式定義可能會(huì)被多次用到,或者比較復(fù)雜冗長(zhǎng),反復(fù)使用會(huì)很麻煩且造成代碼冗余,這個(gè)時(shí)候我們可以引入interface來(lái)統(tǒng)一定義接口。
// 定義接口
interface SearchFunc {
(source: string, subString: string): boolean //(參數(shù)名:參數(shù)類型,參數(shù)名:參數(shù)類型):函數(shù)返回類型
}
let mySearch: SearchFunc = function(source, subString) {
return source.search(subString) != -1
}
//如果你想,你也可以在引用了函數(shù)定義接口后再對(duì)函數(shù)進(jìn)行二次定義,但也必須前后定義相同,一旦出現(xiàn)沖突,就會(huì)報(bào)錯(cuò)。
let mySearch: SearchFunc = function(source:string, subString:string) :boolean {
return source.search(subString) != -1
}
4.可選參數(shù)
在ts如果你已經(jīng)嘗試過上面的步驟,你應(yīng)該已經(jīng)發(fā)現(xiàn)了一個(gè)問題,ts語(yǔ)法相對(duì)嚴(yán)格,你聲明函數(shù)時(shí)規(guī)定了幾個(gè)參數(shù),你調(diào)用時(shí)就必須傳入幾個(gè)參數(shù),否則報(bào)錯(cuò)。但有時(shí)候我們希望個(gè)別參數(shù)在調(diào)用時(shí)可傳可不傳,這個(gè)時(shí)候我們就要用到可選參數(shù)。
// 可選參數(shù)
function buildName(firstName: string, lastName?: string) { //參數(shù)后加?標(biāo)示該參數(shù)可傳可不傳
}
let myName = buildName('William', 'W');
let yourName = buildName('William'); //若聲明時(shí)不加?,則這種調(diào)用方法直接報(bào)錯(cuò)。
//注意:可選參數(shù)一定要放在后面,多參數(shù)時(shí)一定不能第一個(gè)參數(shù)起就是可選參數(shù),這樣會(huì)引起歧義。
function buildName(firstName?: string, lastName: string) { //如果我們這么寫,直接報(bào)錯(cuò)
}
//另外一種方法
let myName = buildName('William', 'W');
let yourName = buildName('William');
function push(array:any[], ...items:any[]) { //...items表示后面接收到的所有參數(shù)
items.forEach( item => {
array.push(item)
})
}
let arr:Array<any> = [];
push(arr, 1, 2, 3, 4, 5, undefined, '5', true)
console.log(arr) //[ 1, 2, 3, 4, 5, undefined, '5', true ]
5.函數(shù)的重載
前面提到我們可以在聲明函數(shù)的時(shí)候定義參數(shù)的類型和函數(shù)的返回類型,但是當(dāng)我們用聯(lián)合聲明的方式聲明了一個(gè)參數(shù)會(huì)同時(shí)存在多種類型且函數(shù)可能存在多種返回值的時(shí)候,如果我們想讓參數(shù)類型和函數(shù)返回類型一一對(duì)應(yīng),那我們就可以用到函數(shù)的重載。
//聯(lián)合聲明
function reverse(x: number | string ) : number | string {
if(typeof x === 'number'){
return Number(x.toString().split('').reverse().join())
} else {
return x.toString().split('').reverse().join()
}
}
//但如果我們想在聲明時(shí)就明確入?yún)umber對(duì)應(yīng)返回number,入?yún)tring對(duì)應(yīng)返回string,就需要用到下面的方法了。
// 函數(shù)的重載
function reverse(x: number ):number;
function reverse(x: string ):string; //提前聲明兩個(gè)同名函數(shù),確定入?yún)⒑头祷刂怠?function reverse(x: number | string ) : number | string {
if(typeof x === 'number'){
return Number(x.toString().split('').reverse().join())
} else {
return x.toString().split('').reverse().join()
}
}