【问题标题】:Strongly typed Immutable.js Records in TypeScriptTypeScript 中的强类型 Immutable.js 记录
【发布时间】:2017-11-25 00:43:22
【问题描述】:

我找不到这个问题的好资源。本质上,我想使用 TypeScript 中的接口来描述我的数据的类型,但我的数据是 Immutable.js 记录,这似乎使事情变得复杂,请参阅下面的示例。

interface tree extends Immutable.Map<string, any> {
  readonly id: number,
  readonly type: number
}

let trees = Immutable.List<tree[]>([
  Map<tree>({
     id: 101,
     type: 1
  }),
  Map<tree>({
     id: 201,
     type: 3
  })
])

以上问题:

  1. 为什么我必须重复列表中每个地图的类型?创建列表时不应该简单地由&lt;tree[]&gt; 声明类型吗?然后对添加到列表中的任何地图进行类型检查?
  2. 目前此示例错误,指出“属性 'id' 与索引签名不兼容。类型 'number' 不可分配给类型 'tree'。这是有道理的!但是,阅读文档,我无法工作怎么让它工作?阅读文档,它说我需要一个 ID,但我想要一个地图数组,如果我没弄错的话,在这种情况下我的签名只是标准数组 ID?

我已经为此工作了好几天,但我根本无法让它工作,根据我所阅读的所有内容,它应该很简单。

任何帮助将不胜感激。

【问题讨论】:

  • 我不熟悉 Immutable.js,但我试过了,它编译得很好,适合我在列表中使用 Immutable.Map({id: 101, type: 1})。根据他们的任何类型,调用Map&lt;tree&gt; 没有意义。

标签: javascript angular typescript immutable.js


【解决方案1】:

您正在创建arraystreesList,这是一个扩展的Map。它应该是这样的:

let trees = Immutable.List<tree[]>(
    [ // List
        [ // Array
            <tree>Immutable.Map<any>({
                id: 101,
                type: 1
            }),
            <tree>Immutable.Map<any>({
                id: 201,
                type: 3
            })
        ]
    ]
);

回答您的问题:

  1. 您没有重复每个地图的类型。实际上,您正在调用从对象构建映射的方法Map。我添加了&lt;tree&gt; 演员表,因为它是trees 的数组,而不是地图。
  2. 你正在尝试类似的东西:

    var singleTree: tree = Immutable.Map<tree>(
        { id: 101, type: 1 }
    );
    

    但是你的树是any 类型的映射。所以,这是正确的语法:

    let singleTree: tree = <tree>Immutable.Map<any>(
        { id: 101, type: 1 }
    );
    

对于上面的代码,如果我们创建一个tree 函数来包装Map 函数,我们可以简化并强制进行类型检查,因此,最终的解决方案是:

function tree(obj: { [key: string]: any, id: number, type: number }): tree {
    return <tree>Immutable.Map<any>(obj);
}

let trees = Immutable.List<tree[]>(
    [ // List
        [ // Array
            tree({
                id: 101,
                type: 1
            }),
            tree({
                id: 201,
                type: 3
            })
        ]
    ]
);

【讨论】:

  • 这就是我所追求的。基本上你已经确认你不能使用类型检查来创建地图,我需要自己编写(在函数或类似函数中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多