有人可以解釋爲什麼這不起作用:打字稿:polymorhpic此,超載簽名不是與功能實現兼容
abstract class Model {
static deserialize<T extends Model>(this: (new() => T), object: any): T;
static deserialize<T extends Model>(ctor: (new() => T), object: any): T {
return new ctor();
}
static deserializeArray<T extends Model>(this: (new() => T), ...objects: any[]): T[];
static deserializeArray<T extends Model>(ctor: (new() => T), ...objects: any[]): T[] {
return objects.map(object => Model.deserialize(ctor, object));
}
}
class MyModel extends Model { }
這將使:
let myModel = MyModel.deserialize({});
let myModels = MyModel.deserializeArray({}, {}, {});
或
let myModel = Model.deserialize(MyModel, {});
let myModels = Model.deserializeArray(MyModel, {}, {}, {});
Typescript 2.5.2抱怨「過載簽名與函數實現不兼容」。
爲什麼需要這兩種形式?
考慮一個REST API返回序列化(JSON)型號:
class MyModelController {
get(id: number) {
let myModel = ... some db/service call ...
return myModel.serialize();
}
}
然後一個通用服務(角),請求模型:
@Injectable()
abstract class HttpService {
constructor(private http: Http) { }
errorHandler(response) {
...
}
get<T extends Model>(ModelType: (new() => T), endpoint: string): Observable<T> {
return this.http.get(endpoint)
// we can't call ModelType.deserialize() here...
.map(response => Model.deserialize(ModelType, response.json()))
.catch(response => this.errorHandler(response));
}
}
@Injectable()
class MyModelService extends HttpService {
get(id: number) {
return super.get(MyModel, `/api/models/${id}`);
}
}
解決方案
abstract class Model {
static deserialize<T extends Model>(this: (new() => T), object: {}): T;
static deserialize<T extends Model>(this: Function & { prototype: Model }, ctor: (new() => T), object: {});
static deserialize<T extends Model>(this: (new() => T), first: (new() => T) | {}, second?: any) {
return typeof first === "function" ? new first() : new this();
}
static deserializeArray<T extends Model>(this: (new() => T), ...objects: {}[]): T[];
static deserializeArray<T extends Model>(this: Function & { prototype: Model }, ctor: (new() => T), ...objects: {}[]): T[];
static deserializeArray<T extends Model>(this: (new() => T), first: (new() => T) | {}[], second?: {}[]): T[] {
const ctor = typeof first === "function" ? first : this;
const objects = typeof first === "function" ? second : first;
return objects.map(object => Model.deserialize(ctor, object));
}
}
這允許兩種形式同時保留abstract
。
第二種形式有什麼意義?如果你可以做'MyModel.deserialize({});'爲什麼你需要做'Model.deserialize(MyModel,{});'? –
是的,但是如果你有'ModelType',那麼你可以簡單地做'ModelType。反序列化(...)'。它肯定會擴展'Model',因此它有一個對靜態'deserialize'函數的引用。 –
我無法調用'ModelType.deserialize()'。如果我重構包含'ModelCtor'類型(其具有反序列化簽名),則'MyModel'不能分配給'ModelCtor '。 –