Я создаю систему событий в Unity Tiny, потому что система в самой среде очень ограничена. Я получил это работает, но теперь я хотел бы сделать его более удобным для моих коллег. Поэтому я попытался набрать его, чтобы пользователи не могли использовать разные типы, но, похоже, он мне не подходит. Любые предложения?
Я уже смотрел на них: - https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0 - https://dev.to/krumpet/generic-type-guard-in-typescript-258l
Проблема в том, что Unity Tiny использует ES5. Таким образом, вы не можете получить object.construtor.name для получения имени типа. Поэтому использование «instanceof» невозможно.
Кроме того, (объект как T) не работает, и я не смог получить (объект как T) .type.
export class Event<T> implements IEvent<T>{
private handlers: {(data?: T): void}[] = [];
public type : T;
constructor(value: T){
this.type = value;
}
public On(handler: { (data?: T): void }) : void {
this.handlers.push(handler);
}
public Off(handler: { (data?: T): void }) : void {
this.handlers = this.handlers.filter(h => h !== handler);
}
public Trigger(data?: T) {
this.handlers.slice(0).forEach(h => h(data));
}
public Expose() : IEvent<T> {
return this;
}
}
export class EventUtils {
public static events = new Object();
public static CreateEvent<T>(eventEntity: ut.Entity, nameOfEvent: string) : void{
this.events[nameOfEvent] = new game.Event<T>();
}
public static Subscribe<T>(nameOfEvent: string, handeler: {(data? : T): void}) : void{
//Loop through events object, look for nameOfEvent, use checkEventType() to check if it is the same type as given generic, then subscribe if true.
}
public static Trigger<T>(nameOfEvent: string, parameter?: T) : void{
//Loop through events object, look for nameOfEvent, use checkEventType() to check if it is the same type as given generic, then trigger if true.
}
private static checkEventType<T>(object: any) : object is Event<T>{
let temp : T;
let temp2 = {temp};
if (object.type instanceof temp2.constructor.name) {
return true;
}
return false;
}
}
}
private static checkEventType<T>(object: any) : object is Event<T>{
let temp : T;
if (object.type as typeof temp) {
return true;
//always returns true even if the type is different
}
return false;
}
}
и
let temp : T;
if ((object.type as typeof temp).type) {
return true;
//property 'type' does not exist in 'T'
}
return false;