typescript基礎——函數

定義函數

函數的輸入輸出要進行類型的定義,函數的參數一旦定義好以後,輸入多或者少都是會編譯報錯的,返回類型也必須跟定義的一致;

// 1
function fun(a: string, b: number): number {
   return parseInt(a + b);
}
// 2 這種寫法只對右側的匿名函數進行了類型定義,左側的funs只能通過類型推斷得出
const funs = function(a: string, b: number):number {
   return parseInt(a + b);
}
// 3 等號兩側都進行了類型定義
const funs: (a: string, b: number)=> number = function (a: string, b: number): number{
	return parseInt(a + b);
}
// 這裏的 => 不要跟es6裏的箭頭函數混淆,ts裏用於表示函數的定義,左邊是輸入類型,需要用括號括起來;右邊是輸出類型

可選參數和默認值

通過?可以指定可選參數,如下:

function fun(a: number, a2: string='2', b?: string):number {}

注意

  • 可選參數必需出現在必需參數的後面;
  • ts會把設置了默認值的參數當成是可選參數, 這樣的可選參數不受前面的約束

剩餘參數

可以通過es6展開操作符來指定剩餘參數, 當前剩餘參數只能是最後一個參數

function fun(array: any[], ...rest: any[]):any[]{}

用接口方式定義函數

通過這種方式 可以對函數表達式定義的函數 進行等號左側的類型定義,保證了傳入的參數和返回值類型不變

interface Func {
	(a: string, b: number): boolean;
}
let myFunc: Func;
myFunc = function (a: string, b: number):boolean {}

也可以使用含有泛型的接口來定義函數的形狀

interface CreateArrayFunc {
   <T>(length: number, value: <T>): Array<T>
}
// 可以把泛型參數提到接口名上
// interface CreateArrayFunc<T> {
//    (length: number, value: <T>): Array<T>
// }

let createArray: CreateArrayFunc<any>;
createArray = function<T>(length: number, value: <T>): Array<T> {
   
}

重載

重載允許一個函數接受不同的數量或類型的參數時,作出不同的處理;
可以通過聯合類型來實現不同的處理,但是表達起來不夠精確。(例如如下方法,對參數反轉,用聯合類型無法表達清楚,傳入的是數字類型,返回也是數字類型。)
通過重載,可以表達清晰;在寫重載時,前幾次都是定義,最後一個纔是具體的函數實現。

// ts會按照定義順序,自上而下匹配,如果多個函數定義有包含關係,需要優先把精確的定義寫在前面。
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 if (typeof x === 'string') {
       return x.split('').reverse().join('');
    }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章