Попытка набрать мою систему событий в UnityTiny - PullRequest
1 голос
/ 23 октября 2019

Я создаю систему событий в 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;

1 Ответ

0 голосов
/ 23 октября 2019

instanceof существует и поддерживается некоторое время , поэтому вы можете использовать его даже в ES5.

Единственная проблема - это способ проверки. Если вам нужно проверить экземпляр класса, вам нужно иметь класс (а не только тип) в функции checkEventType:

public static checkEventType<T>(cls: new (...a: any[]) => T, object: any): object is Event<T> {
    if (object.type instanceof cls) {
        return true;
    }
    return false;
}

Play

...