在通用接口中使用接口

San*_*ord 4 generics interface typescript

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

interface IStringTMap<T> { [s: string]: T; };
Run Code Online (Sandbox Code Playgroud)

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

interface IStringFunctionMap extends IStringTMap<Function> { };
Run Code Online (Sandbox Code Playgroud)

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

var obj = {
    "group_1" : {
        "func_1" : function() {},
        "func_2" : function() {}
    },
    "group_2" : {
        "func_1" : function() {},
        "func_2" : function() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以很容易地从原始位构建这个界面

interface IFunctionGroups { [s: string]: { [s: string]: Function } };
Run Code Online (Sandbox Code Playgroud)

我将如何使用现有的界面使其更具可读性IStringTMap

我尝试过使用我的穴居人逻辑,但只是将一个界面推入另一个界面

interface IFunctionGroups extends IStringTMap<IStringFunctionMap>;
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

接口仅使用可选类型参数扩展标识符/限定名称。

Sea*_*mus 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() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

编译后不会出现错误或警告:

var obj = {
    "group_1": {
        "func_1": function () { },
        "func_2": function () { }
    },
    "group_2": {
        "func_1": function () { },
        "func_2": function () { }
    }
};
Run Code Online (Sandbox Code Playgroud)