TypeScript 中的過載建構函式

Shuvayan Ghosh Dastidar 2023年1月30日
  1. 在 TypeScript 中過載建構函式以初始化類
  2. 在 TypeScript 中使用靜態工廠替代建構函式過載
TypeScript 中的過載建構函式

建構函式過載是程式設計中的一個基本概念。我們可以通過引數的數量和型別來區分同一類的不同建構函式。

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"
Shuvayan Ghosh Dastidar avatar Shuvayan Ghosh Dastidar avatar

Shuvayan is a professional software developer with an avid interest in all kinds of technology and programming languages. He loves all kinds of problem solving and writing about his experiences.

LinkedIn Website

相關文章 - TypeScript Constructor