TypeScript 函式相容

admin發表於2018-08-12

比較兩個函式是否相容,首先要看引數是否相容,第二個還要看返回值是否相容。

函式引數:

首先看一段程式碼例項:

[typescript] 純文字檢視 複製程式碼
let funcX = (num: number) => 0;
let funcY = (num: number, str: string) => 0;

funcY = funcX;

上面的賦值成立;funcxY具有兩個引數,funcX具有一個引數,之所以funcX賦值給funcY成立。

funcX函式引數少於funcY是允許的,這在JavaScript中也是允許的,比如定義一個3個引數的函式,呼叫的時候只傳遞一個,但是反過來將會報錯,程式碼如下:

[typescript] 純文字檢視 複製程式碼
funcX = funxY;

上面的程式碼會報錯,funxY中的必須引數必須在funcX中找到對應的引數。

引數的名稱沒必要是相同的,只要型別相容即可:

[typescript] 純文字檢視 複製程式碼
let funcX = (ant: number) => 0;
let funxY = (num: number, str: string) => 0;

funxY = funcX;

將funcX第一個引數更名為ant,同樣是相容的。

兩個函式引數的型別沒必要完全相同的,源函式引數引數可以賦值給目標函式對應引數,或者目標函式引數可以賦值給源函式對應引數即可,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
let funcX = (ant: number&boolean) => 0;
let funcY = (num: number, str: string) => 0;
 
funcY = funcX;

 源型別上有額外的可選引數不是錯誤,目標型別的可選引數在源型別裡沒有對應的引數也不是錯誤:

[typescript] 純文字檢視 複製程式碼
let funcX = (ant: number,address?:string,target?:string) => 0;
let funcY = (num: number, str?: string) => 0;
 
funcY = funcX;

funcX雖然有兩個額外引數,但它們都是可選的,所以不會報錯。

對於有過載的函式,源函式的每個過載都要在目標函式上找到對應的函式簽名,規則同上。

函式的返回值:

如果目標函式的返回值型別是void,那麼源函式返回值可以是任意型別:

[typescript] 純文字檢視 複製程式碼
let funcX : (ant: number) => void;
let funxY = (num: number) => "螞蟻部落";

funcX = funxY;

如果不是void型別,那麼源函式的返回值需要能夠賦值給目標函式返回值型別:

[typescript] 純文字檢視 複製程式碼
let funcX : (ant: number) => number|string;
let funxY = (num: number) => "螞蟻部落";

funcX = funxY;

相關文章