1
私の個人的なプロジェクトの1つでは、オブジェクトとリストの種類をいくつか設計しようとしていました。オブジェクトとリストは直列化可能であると考えられています(すなわち、toJSON()
とfromJSON()
メソッドを持っています)。私が働いているすべてのオブジェクトとリストは、少なくとも方法ここに記載されているTypescript :: Abstract static
type IPerson = {
id: number;
name: string;
// additional properties
}
class Person {
id: number;
name: string;
// additional properties
constructor(id: number, name: string, ...) { ... }
toJSON(): IPerson { return { ... } }
static fromJSON(json: IPerson): Person { return new Person(...) }
// additional methods
}
class PersonList {
list: Person[];
constructor(list: Person[]) { ... }
findById(id: number) { return this.list.find(it => it.id === id) }
findByName(name: string) { return this.list.find(it => it.name === name) }
add(person: Person) { this.list.push(person) }
remove(person: Person) { this.list = this.list.filter(it => it !== person) }
toJSON(): IPerson[] { return this.list.map(it => it.toJSON()) }
static fromJSON(json: IPerson[]): PersonList { return new PersonList(json.map(it => Person.fromJSON(it))) }
// additional methods
}
:サンプルオブジェクトとリストは以下の基本的なコードを持っているでしょう。 (それはしない)、それはこのように私の人生は同じくらい簡単になるだろう
type JSON = {
id: number;
name: string;
}
abstract class BaseObject<T extends JSON> {
abstract get id();
abstract get name();
constructor(id: number, name: string) { ... }
abstract toJSON(): T
abstract static fromJSON(json: T): BaseObject<T>
}
class BaseList<T, U> {
list: BaseObject<T>[];
constructor(list: BaseObject<T>[]) { ... }
findById(id: number) { return this.list.find(it => it.id === id) }
findByName(name: string) { return this.list.find(it => it.name === name) }
add(obj: BaseObject<T>) { this.list.push(obj) }
remove(obj: BaseObject<T>) { this.list = this.list.filter(it => it !== obj) }
toJSON(): U[] { return this.list.map(it => it.toJSON()) }
static fromJSON(json: U[]): BaseList<T, U> { return new BaseList<T, U>(json.map(it => BaseObject<T>.fromJSON(it))) }
}
この構築物は働いていた場合::
は今、私は一般的なソリューションようにこれを変換しようとしているtype IPerson = JSON & {
// additional fields
}
class Person extends BaseObject<IPerson> {
get id() { ... }
get name() { ... }
// additional getters for other fields
toJSON(): IPerson { return { ... } }
static fromJSON(json: IPerson): Person { return new Person(...) }
// additional methods
}
class PersonList extends BaseList<Person, IPerson> {
// additional methods
}
// other object and list types definitions follow
はしかし、私の解決策は、これらの点で失敗:
BaseObject
は抽象静的を持つことができません方法。BaseList
は、抽象的なスタティックfromJSON()
メソッドを持つことはできません。BaseList.fromJSON()
は新しいリストをインスタンス化することはできず、BaseObject.fromJSON()
を呼び出して新しいオブジェクトをインスタンス化することもできません。
どうすればこれらの問題を回避できますか?ここで欠けているより良いデザインパターンがありますか?