我有一个扩展类字典类的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;
}
}
答案 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)();
}
}
通过这种方式,您可以控制回调的签名,甚至可以控制不同的回调(通过将此接口扩展到另一个接口)。