带有泛型的打字稿中的问题:无法读取未定义的属性"原型"

dra*_*707 2 generics typescript

我正在学习一些打字稿,但我不完全确定我的代码中的问题是什么.

我正在尝试实现一个事件系统,以通用的方式使我的域可观察(类似于C#与事件的关系)并且它编译顺利.当我注册一个处理程序时,它甚至会在intellisense(发送者?)中显示正确的类型推断.

但是当我尝试运行它时,我会在__extends帮助函数中得到一个"未捕获的TypeError:无法读取未定义的属性'原型'".

这是我的代码:

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);
    }
}


}
Run Code Online (Sandbox Code Playgroud)

我也可以在操场上模拟它: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(发件人%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(处理机%3A %20EventHandler%3CS%2C%20T%3E)%3A%20void%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.handlers.push(处理程序)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20remove(处理机%3A %20EventHandler%3CS%2C%20T%3E)%3A%20void%20%7B%0A%20%20%20%20%20%20%20%20%20%2 0%20%20this.handlers%20%3D%20this.handlers.filter(H%20%3D%3E%20H%20%!3D%20handler)%3B%0A%20%20%20%20%20% 20%20%20%7D%0A 0A%%20%20%20%20%20%20%20%20public%20raise(参数... args%3A%20any%5B%5D)%3A%20void%20% 7B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20(VAR%20 1%20%3D%200%3B%20I%20%3C%20this. handlers.length%3B%20I%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.handlers%5Bi %5D.call(此%2C%20args)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A 0A%% 20%20%20%20%7D%0A

我在Internet Explorer(我在vs2013中用于调试)和chrome中遇到了同样的问题.

有没有人知道可能有什么问题?

-

编辑:看起来像罪魁祸首 export class StdEvent<S> extends EventDelegate<S, IEventArgs> {

任何人都可以解释为什么这会导致运行时错误但编译器很高兴同意它?

Noe*_*ams 8

EventDelegate需要在派生类之前定义基类StdEvent

export class EventDelegate {

}

export class StdEvent extends EventDelegate {
}

可以想象,在未来的版本中,TypeScript编译器会为您处理这个问题,但在此之前,您有责任正确地对这些定义进行排序.