と互換性がありません:活字体: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では、「オーバーロードシグネチャは関数の実装と互換性がありません」という文句があります。
なぜ両方のフォームが必要ですか?
シリアル化された(JSON)のモデルを返しREST APIを考えてみましょう:モデルを要求する
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
を保存しています。私の意見で
第2フォームのポイントは何ですか?あなたが 'MyModel.deserialize({});を行うことができれば、なぜ' Model.deserialize(MyModel、{}); 'を実行する必要がありますか? –
ええ、もしあなたが 'ModelType'を持っていれば' ModelType。デシリアライズ(...) '。 'Model'を確実に拡張するため、静的' deserialize'関数への参照があります。 –
'ModelType.deserialize()'を呼び出すことができません。あなたが 'ModelCtor'型(逆シリアル化署名を持つ)型を含むようにリファクタリングすると、 'MyModel'は' ModelCtor 'に割り当てられません。ありがとう、これは間違いなく正しい方向に私を指摘した。 –