[英]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.