TypeScript 中的過載建構函式
Shuvayan Ghosh Dastidar
2023年1月30日
2022年5月18日
建構函式過載是程式設計中的一個基本概念。我們可以通過引數的數量和型別來區分同一類的不同建構函式。
TypeScript 還支援建構函式過載;但是,它不同於 C++ 或 Java 等語言中的傳統建構函式過載。
本文將討論使用建構函式過載來實現各種業務邏輯。
在 TypeScript 中過載建構函式以初始化類
在 TypeScript 中,可以通過宣告多個建構函式或讓單個建構函式伴隨著 ?
來過載建構函式和聯合運營商。但是,所有的建構函式都必須有一個共同的實現。
以下程式碼段解釋瞭如何實現這一點。
class Fruits {
public apple : string | number;
public numBananas : number;
public unknownFruit : string;
// default
constructor();
// // parameterized constructors
constructor(a : string );
constructor(a : string , b : number );
constructor(a : number , b : number, c : string );
// common implementation
constructor( a? : string | number, b? : number, c? : string ){
this.apple = 0;
if ( a !== undefined ){
this.apple = a;
if ( typeof a === "string"){
console.log("Got apple of country: ", this.apple);
} else if ( typeof a === "number") {
console.log("Number of apples got: ", this.apple);
}
} else {
console.log("Apple field assigned 0 by default constructor");
}
this.numBananas = b ?? 0;
this.unknownFruit = c ?? "";
}
}
var fruitDefaultConstrutor = new Fruits();
var fruitWithOnlyAppleDecalred = new Fruits("India");
var fruitWithAppleBananaDecalred = new Fruits("India", 4);
var fruitWithAppleBananaUnkwownDeclared = new Fruits(8, 4, "Orange");
輸出:
"Apple field assigned 0 by default constructor"
"Got apple of country: ", "India"
"Got apple of country: ", "India"
"Number of apples got: ", 8
我們在 Fruits
類中定義了多個建構函式。預設建構函式沒有引數,而其他建構函式具有不同數量的不同型別的引數。
所有的建構函式都有一個實現。引數的各種型別由聯合運算子或|
表示如 a? : 字串 |數字
。
在一個引數之後,?
運算子表示在呼叫建構函式時該欄位可能保持為空,允許我們通過單個實現來實現不同的建構函式定義。
然而,呼叫 new Fruits("India", 4, "Orange")
會給出錯誤,因為沒有相容的建構函式定義,儘管滿足通用實現方法的型別。
我們可以通過刪除建構函式定義並僅使用通用實現來改進這一點。
class Fruits {
public apple : string | number;
public numBananas : number;
public unknownFruit : string;
// common implementation
constructor( a? : string | number, b? : number, c? : string ){
this.apple = 0;
if ( a !== undefined ){
this.apple = a;
if ( typeof a === "string"){
console.log("Got apple of country : ", this.apple);
} else if ( typeof a === "number") {
console.log("Number of apples got : ", this.apple);
}
} else {
console.log("Apple field assigned 0 by default constructor");
}
this.numBananas = b ?? 0;
this.unknownFruit = c ?? "";
}
}
輸出:
"Got apple of country : ", "India"
因此,可以過載建構函式以初始化不同的欄位或設定一些初始邏輯。
在 TypeScript 中使用靜態工廠替代建構函式過載
當處理許多建構函式並使用 ?
時,建構函式過載邏輯很快就會變得醜陋。和聯合運算子。初始化類的另一種方法是通過 TypeScript 中的靜態工廠模式。
下面的程式碼段將討論我們如何實現這一點。
class Fruits {
public apple : string | number;
public numBananas : number;
public unknownFruit : string;
constructor(){
this.apple = "";
this.numBananas = 0;
this.unknownFruit = "";
}
static fromAppleCountry( a : string) : Fruits {
var fruits = new Fruits();
fruits.apple = a;
console.log("Got apple of country : ", fruits.apple);
return fruits;
}
}
var fruitWithOnlyAppleDecalred = Fruits.fromAppleCountry("India");
輸出:
"Got apple of country : ", "India"
Author: Shuvayan Ghosh Dastidar