TypeScript

时间:2017-06-21 22:58:15

标签: javascript angular typescript immutable.js

我无法找到这个问题的好资源。基本上我想用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. 为什么我必须在列表中重复每个地图的类型?在创建列表时,<tree[]>是否应该简单地声明类型?然后添加到列表中的任何地图都要针对此进行类型检查吗?
  2. 目前这个示例错误,说明&#34;属性&#39; id&#39;与索引签名不兼容。输入&#39;数字&#39;不能分配给树&#39;树。哪个有道理!但是,阅读文档,我无法解决如何使其工作?阅读它说明的文档我需要一个ID,但我想要一组地图,在这种情况下,我的签名只是标准的数组ID,如果我没有弄错的话?
  3. 我已经在这方面工作了好几天,我根本无法让它工作,根据我读过的所有内容应该很简单。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您正在创建List arrays trees Map,这是一个扩展let trees = Immutable.List<tree[]>( [ // List [ // Array <tree>Immutable.Map<any>({ id: 101, type: 1 }), <tree>Immutable.Map<any>({ id: 201, type: 3 }) ] ] ); 。这应该是它的样子:

Map

回答你的问题:

  1. 您不是在重复每张地图的类型。实际上,您正在调用从对象构建映射的方法<tree>。我添加了trees广告,因为它是var singleTree: tree = Immutable.Map<tree>( { id: 101, type: 1 } ); 的数组,而不是地图。
  2. 你正在尝试这样的事情:

    any

    但您的树是let singleTree: tree = <tree>Immutable.Map<any>( { id: 101, type: 1 } ); 类型的地图。所以,这是正确的语法:

    tree
  3. 对于上面的代码,如果我们创建一个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 }) ] ] ); 函数,我们可以简化并强制进行类型检查,因此,最终的解决方案是:

    "[href='#"+id+"']").parent().find('div')