Búsqueda de sitios web

Problema en TypeScript con genéricos: No se puede leer la propiedad 'prototype' de undefined


Estoy aprendiendo algo de TypeScript, pero no estoy completamente seguro de cuál es el problema en mi código.

Estoy intentando implementar un sistema de eventos para hacer que mi dominio sea observable (similar a lo que C# tiene con eventos) de manera genérica y se compila sin problemas. Incluso muestra la inferencia de tipo correcta en IntelliSense (¿para el remitente?) cuando registro un manejador.

Pero cuando intento ejecutarlo, sigo recibiendo un "Uncaught TypeError: Cannot read property 'prototype' of undefined" en la función auxiliar __extends.

Este es mi código:

module Pathing.Domain {

export interface IEventArgs {

}

export interface EventHandler<S,T extends IEventArgs> {
    (sender?: S, e?: T): void
}

export class StdEvent<S> extends EventDelegate<S, IEventArgs> {

}

export class EventDelegate<S, T> {
    private handlers: EventHandler<S,T>[] = [];

    public add(handler: EventHandler<S, T>): void {
        this.handlers.push(handler);
    }

    public remove(handler: EventHandler<S, T>): void {
        this.handlers = this.handlers.filter(h => h != handler);
    }

    public raise(...args: any[]): void {
        for (var i = 0; i < this.handlers.length; i++)
            this.handlers[i].call(this, args);
    }
}


}

También puedo simularlo en el campo de pruebas: http://www.typescriptlang.org/Playground#src=%20module%20Pathing.Domain%20%7B%0A%0A%20%20%20%20export%20interface%20IEventArgs%20%7B%0A%0A%20%20%20%20%7D%0A%0A%20%20%20%20export%20interface%20EventHandler%3CS%2CT%20extends%20IEventArgs%3E%20%7B%0A%20%20%20%20%20%20%20%20(sender%3F%3A%20S%2C%20e%3F%3A%20T)%3A%20void%0A%20%20%20%20%7D%0A%0A%20%20%20%20export%20class%20StdEvent%3CS%3E%20extends%20EventDelegate%3CS%2C%20IEventArgs%3E%20%7B%0A%0A%20%20%20%20%7D%0A%0A%20%20%20%20export%20class%20EventDelegate%3CS%2C%20T%3E%20%7B%0A%20%20%20%20%20%20%20%20private%20handlers%3A%20EventHandler%3CS%2CT%3E%5B%5D%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20public%20add(handler%3A%20EventHandler%3CS%2C%20T%3E)%3A%20void%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this. manejadores.push(manejador);\n }\n\n public remove(manejador: EventHandler): void {\n this.manejadores=this.manejadores.filter(h => h != manejador);\n }\n\n public raise(...args: any[]): void {\n for (var i=0; i < this.manejadores.length; i++)\n this.manejadores[i].call(this, args);\n }\n }\n\n }

Tengo el mismo problema en Internet Explorer (que usé para depurar en VS2013) y Chrome.

¿Alguien tiene alguna idea de qué podría estar mal?

--

Editar: Parece que el culpable es export class StdEvent<S> extends EventDelegate<S, IEventArgs> {

¿Alguien puede arrojar algo de luz sobre por qué esto resulta en un error en tiempo de ejecución mientras que el compilador lo acepta con gusto?

Respuesta #1

La clase base EventDelegate necesita ser definida antes de la clase derivada StdEvent

export class EventDelegate {

}

export class StdEvent extends EventDelegate {
}

Es concebible que en una versión futura el compilador de TypeScript se encargue de esto por ti, pero hasta entonces eres responsable de ordenar las definiciones correctamente.