在泛型接口中使用接口

4

我在使用对象字面量时会使用泛型来帮助简化接口构建的过程。例如,我所有使用字符串作为键的对象的基础接口是

interface IStringTMap<T> { [s: string]: T; };

如果我想使用这个来强制一个对象完全由函数组成,我会创建一个新的接口

interface IStringFunctionMap extends IStringTMap<Function> { };

然而,有时我需要使用更复杂的对象。例如,假设我想要构建以下结构:

var obj = {
    "group_1" : {
        "func_1" : function() {},
        "func_2" : function() {}
    },
    "group_2" : {
        "func_1" : function() {},
        "func_2" : function() {}
    }
}

我可以很容易地从原始数据构建此界面。
interface IFunctionGroups { [s: string]: { [s: string]: Function } };

如果我使用现有的 IStringTMap 接口,如何使这个更易读?

我尝试过用我的“穴居人逻辑”,但只是把一个接口塞到另一个里面并不能解决问题。

interface IFunctionGroups extends IStringTMap<IStringFunctionMap>;

给我返回以下错误信息:
接口只能扩展具有可选类型参数的标识符/限定名称。
1个回答

8
在你的接口声明后添加花括号{ }可以解决这个问题:
interface IStringTMap<T> { [s: string]: T; }

interface IStringFunctionMap extends IStringTMap<Function> { }

interface IFunctionGroups extends IStringTMap<IStringFunctionMap> { }

var obj: IFunctionGroups = {
    "group_1" : {
        "func_1" : function() {},
        "func_2" : function() {}
    },
    "group_2" : {
        "func_1" : function() {},
        "func_2" : function() {}
    }
}

这段代码可以无误或警告地编译为:
var obj = {
    "group_1": {
        "func_1": function () { },
        "func_2": function () { }
    },
    "group_2": {
        "func_1": function () { },
        "func_2": function () { }
    }
};

回头检查了我的代码,我在接口声明后面漏掉了括号 - 真是个笨蛋。无论如何,你的代码给了我并排显示的效果,突出了这个错误。谢谢!请检查一下并点赞。 - Sandy Gifford
1
问题:如果我修改了我的问题,删除interface IFunctionGroups extends IStringTMap<IStringFunctionMap> { };后面的括号,你是否愿意编辑你的问题,指出它们缺失了?这样做也许可以使问题更相关和有用。 - Sandy Gifford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接