【问题标题】:How can I define the return type of a lodash reduce function with Typescript?如何使用 Typescript 定义 lodash reduce 函数的返回类型?
【发布时间】:2014-07-29 03:02:01
【问题描述】:

我正在尝试定义这个 Typescript 函数的输出。

function (data: { topicId: number; subTopicId: number; topicName: string; subTopicName; string; }[] ) {
            var output = <IAnything>{
                dataMap: _.reduce(data, function (rv, v) {
                    rv[v.subTopicId] = v;
                    return rv;
                }, {});

我可以映射一些我没有包含在这个问题中的部分,但我对如何制作 dataMap 字段感到困惑。有人可以帮助我并告诉我如何在下面的界面中映射 lodash _.reduce 的输出。从我可以看到这个reduce的输出是:

data: { topicId: number; subTopicId: number; topicName: string; subTopicName; string; }[]

但是我如何表示这个以及如何表示用于数组索引的 subTopicId?

interface IAnything {
    //data: { id: number; name: string; }[];
    dataMap: 
}

dataMap 输出如下所示:

{
 "1":{"topicId":1,
      "subTopicId":1,
      "topicName":"x",
      "subTopicName":"x"},
 "2":{"topicId":1,
      "subTopicId":2,
      "topicName":"x",
      "subTopicName":"x"},
 "62":{"topicId":10,
       "subTopicId":62,
       "topicName":"x",
       "subTopicName":"x"}
}

【问题讨论】:

    标签: angularjs typescript


    【解决方案1】:

    您的界面应如下所示:

    interface IAnything
    {
        dataMap: IMap
    }
    
    interface IData
    {
        topicId: number;
        subTopicId: number;
        topicName: string;
        subTopicName; string;
    }
    
    interface IMap{
        [key: string] : IData;
    }
    

    那么你的函数应该是这样的:

    function (data: IData[]){
        var output = <IAnything>{
            dataMap: _.reduce(data, function (rv: IData, v: IData)
            {
                rv[v.subTopicId] = v;
                return rv;
            }, {})
        };
    }
    

    【讨论】:

    • 谢谢。我现在正在看这个。
    • 我刚刚注意到它不正确,因为我错过了将编译的构造 rv[v.subTopicId] = v;,但在编辑期间此属性在 TypeScript 中不可见。相反,动态地创建这样的属性,我什至会在另一个接口(例如 IMap)上预先创建一个属性,并将其用作 IAnything 中的 dataMap 类型。此 IMap 将具有您需要的任何属性,并且在 reduce func 中您只需将对象传递给它们,而不是动态创建新属性。
    • 我添加了 dataMap 的输出,以便您可以更详细地查看,因为我也意识到映射可能存在一些问题。就 IMap 而言。你能给我一个例子来说明你的意思吗?谢谢。
    • 抱歉,我花了点时间。我刚刚更新了我的答案,以包括我在 IMap 界面中提到的内容。它还基于 Radim Köhler 在您的其他问题中提到的内容:stackoverflow.com/questions/25000239/…
    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2018-09-05
    • 2020-08-05
    相关资源
    最近更新 更多