簡體   English   中英

如何在接口中定義構造函數簽名?

[英]How to define constructor signature in interface?

下面是關於在TypeScript接口(Javascript)中定義構造函數簽名的問題,盡管最終它變得不可用。 但是,這在objective-c中是可能的,並且在其他地方也可以這樣做。

我有一組數據對象類,所有這些都將通過帶有json字符串參數的通用構造函數來使用。 當我選擇TypeScript作為具有編譯器的工具並幫助我更早地找到錯誤和問題時,我如何在接口中定義構造函數然后在類中實現它?

interface IParsable {

  //constructor(json : string);
  new (json : string);
}

class UserObject implements IParsable {

constructor(json : string) {

   //...
}

代碼工作,但編譯器顯示錯誤“錯誤TS2420:類'UserObject'錯誤地實現接口'IParsable'。” 如果我在接口中使用“構造函數”而不是新的,那么我得到“來自交互式IParsable的方法構造函數未實現”。

更新 :在objective-c中,可以使用兩種方法創建對象:

第一種方法

UserObject *userObject = [[UserObject alloc] init]; 

對象的創建包括兩種方法。 Alloc - 分配所需的內存,init是默認的構造函數名稱。 構造函數就像objective-c中的常規方法一樣,並且有自己的名字。 因此,如果您需要一個帶參數的自定義構造函數,那么您只需定義一個新方法,例如initWithJson:(NSString *)json。 因此,您可以在界面中定義所需的任何內容並強制執行合同。

第二種方法

UserObject *userObject = [UserObject new]; 

new是一個保留字,但它實際上執行alloc + init,你不能使用自定義構造函數。 因此,推薦的方法是使用alloc + init,這樣如果需要,您可以隨時使用自定義構造函數方法(如alloc + initWithJson)替換它。

事實證明,即使在java或C#中也無法做到這一點。 我一直認為這些語言在OOP方面更加標准和深思熟慮,盡管這個小東西在objective-c中做得更好。

extends子句定義類的實例的行為,而不是其構造函數 構造函數本身不是類實例的一部分。 基本上,你是說UserObject一個實例 (調用new的結果)本身可以調用new ,但實際情況並非如此:

var x = new UserObject();
var y = new x(); // Nonsense, of course

目前,TypeScript中沒有直接語法來指示構造函數UserObject與接口IParsable匹配。 您可以將其用作解決方法:

class UserObject { ... }
UserObject === <IParsable>undefined;

TypeScript是結構化類型的,因此您可以獲得所需的所有檢查,而無需在類上使用implements關鍵字。

在下面的示例中,檢查傳遞給IParsable的構造函數的參數(在example函數中)。 您也不能將參數傳遞給不滿足IParsable接口的example函數,即它必須接受字符串參數(或根本沒有參數)。

我強調了編譯器將捕獲的三個錯誤。

interface IParsable {
    new (json: string);
}

class ExampleOne {
    constructor(json: string) {

    }
}

class ExampleTwo {
    constructor(json: string) {

    }
}

class ExampleThree {
    constructor(arg: number) {

    }
}

function example(obj: IParsable) {
    // Error - doesn't pass string arg
    //return new obj();

    // Error - wrong argument type
    //return new obj(1);

    return new obj('{ a: "b"}');

}

example(ExampleOne);
example(ExampleTwo);

// Error - Doesn't satisfy IParsable
//example(ExampleThree);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM