TypeScript 函式過載

admin發表於2018-09-02

所謂函式過載就是同一個函式,根據傳遞的引數不同,會有不同的表現形式。

JavaScript本身是沒有過載這個概念,不過可以模擬實現。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
function func(){ 
  if(arguments.length==0){ 
    alert("螞蟻部落");  
  } 
  else if(arguments.length==1){ 
    alert(arguments[0]) 
  } 
} 
func(); 
func(2);

上面程式碼利用arguments物件來判斷傳遞引數的數量,然後執行不同的程式碼。

關於arguments物件可以參閱JavaScript arguments物件詳解一章節。

TypeScript提供了過載功能,但是這個過載功能和C#等語言的過載相比是不完整的。

在標準面嚮物件語言(C#或者java等)中函式過載是根據函式簽名的不同,在函式被呼叫時,根據傳遞實參的型別來繫結到特定的過載函式,但TypeScript的函式過載只有一個函式體,也就是說無論宣告多少個同名且不同簽名的函式,它們共享一個函式體,在呼叫時會根據傳遞實參型別的不同,利用流程控制語句控制程式碼的執行。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
function done(x:string):string;
function done(x:number):number;
function done(x:any):any{
  if(typeof x=="string"){
    return "螞蟻部落"
  }else if(typeof x=="number"){
    return 5
  }
}

function done(x:any):any不是函式過載列表一部分,所以上述程式碼只定義兩個過載。

過載函式的共用函式體部分如下:

[typescript] 純文字檢視 複製程式碼
function done(x:any):any{
  if(typeof x=="string"){
    return "螞蟻部落"
  }else if(typeof x=="number"){
    return 5
  }
}

過載函式編譯後的JavaScript程式碼:

[JavaScript] 純文字檢視 複製程式碼
function done(x) {
  if (typeof x == "string") {
    return "螞蟻部落";
  }
  else if (typeof x == "number") {
    return 5;
  }
}

由於JavaScript本身不支援過載,所以TypeScript過載實質上為了方便呼叫者如何呼叫函式。

相關文章