Я хочу заощадити свій час і використати загальний код для класів, який розширює класи PIXI (2d бібліотека візуалізації webGl).
Інтерфейси об'єкта:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Моя проблема полягає в тому, що код всередині getKeyInManager
і setKeyInManager
не буде змінюватися, і я хочу використовувати його повторно, а не дублювати, ось реалізація:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
Що я хочу зробити, це автоматично додати через a Manager.add()
ключ, який використовується в менеджері для посилання на об’єкт усередині самого об’єкта у його властивості _keyInManager
.
Отже, візьмемо приклад із текстурою. Тут ідеTextureManager
module Game.Managers {
export class TextureManager extends Game.Managers.Manager {
public createFromLocalImage(name: string, relativePath: string): Game.Core.Texture{
return this.add(name, Game.Core.Texture.fromImage("/" + relativePath)).get(name);
}
}
}
Коли я це роблю this.add()
, я хочу, щоб Game.Managers.Manager
add()
метод викликав метод, який існував би на об'єкті, що повертається Game.Core.Texture.fromImage("/" + relativePath)
. Цей об'єкт у цьому випадку буде Texture
:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Я знаю, що IManagedObject
це інтерфейс і не може містити реалізацію, але я не знаю, що писати, щоб ввести клас ObjectThatShouldAlsoBeExtended
всередину мого Texture
класу. Знаючи , що той же процес буде необхідний для Sprite
, TilingSprite
, Layer
і багатьох інших.
Тут мені потрібні досвідчені відгуки / поради TypeScript, це має бути можливо зробити, але не кількома розширеннями, оскільки на той момент можливо лише одне, я не знайшов іншого рішення.