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

时间:2014-07-03 10:07:01

标签: 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);
    }
}


}

我也可以在操场上模拟它: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.handlers.push(handler)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20remove(handler%3A%20EventHandler%3CS%2C%20T%3E)%3A%20void%20%7B%0A%20%20%20%20%20%20%20%20%20%20%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%20i%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(this%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> {

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

1 个答案:

答案 0 :(得分:8)

需要在派生类EventDelegate

之前定义基类StdEvent
export class EventDelegate {

}

export class StdEvent extends EventDelegate {
}

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