如何通过Typescript中的T值执行函数?

时间:2016-04-19 14:04:38

标签: typescript

我有一个扩展类字典类的Router类。我希望Router类的invoke函数将键值对中的值作为函数进行处理。我是Typescript的新手并且遇到类型错误。不知道如何将其作为函数转换而不必更改Dictionary对象。

路由器

export class Routes<T> extends Dictionary<T> {

    invoke(key:string = window.location.hash):void {
        [super.get(key):string]();
    }

}

词典

export class Dictionary<T> {

    private _items: { [key: string]: T };

    constructor(items:{ [key: string]: T } = {}) {
        this._items = items;
    }

    add(key: string, value: T): void {
        this._items[key] = value;
    }

    get(key: string): T {
        return this._items[key];
    }

    remove(key: string): void {
        delete this._items[key];
    }

    contains(key: string): boolean {
        return key in this._items;
    }

}

2 个答案:

答案 0 :(得分:1)

这应该足够了,假设先前的Dictionary

定义
export class Routes<T extends Function> extends Dictionary<T> {
    invoke(key:string = window.location.hash):void {
        super.get(key)();
    }
}

单独的文件

import {Route} from './<route-file>';
type FunctionType = ()=>string
let r = new Routes<FunctionType>()
r.invoke("key")

值得注意的是,FunctionType可以是任何输出类型的任何输入类型,具体取决于您的需要。如果它是一个void函数,那么函数类型可以表示为:

type FunctionType = ()=>void

答案 1 :(得分:1)

如果您的路由器具有功能,那么您最好这样做:

export class Routes extends Dictionary<Function> {
    invoke(key: string = window.location.hash): void {
        this.get(key)();
    }
}

但我认为这可能会更好:

interface RouterHandler {
    (): void;
}

export class Routes extends Dictionary<RouterHandler> {
    invoke(key: string = window.location.hash): void {
        this.get(key)();
    }
}

通过这种方式,您可以控制回调的签名,甚至可以控制不同的回调(通过将此接口扩展到另一个接口)。