【问题标题】:working with complex types in interfaces in (typescript)在 (typescript) 的接口中处理复杂类型
【发布时间】:2018-03-12 20:20:12
【问题描述】:

我对 type script 和 java script 还是很陌生。

我的问题是: 我有一个接口,其中一个属性是 Map 。

我有一个与接口结构相同的 json 对象,当其中一个条目是另一个对象时。我正在尝试将 json 对象分配给接口的变量,但是当我尝试使用 Map 函数时,它说这些函数不存在。

可能是因为 Map 没有初始化。

例如,这是 json 对象:

let obj = 
{
  firstArg: "first"
  secondArg: {one: 1, two: 2}
}

这是界面:

interface example {
  firstArg: string,
  secondArg: Map<string , number>
}

在做:

let exm: example = obj;
exm.secondArg.values().next()

不工作。

完成这项工作的最佳解决方案是什么?

【问题讨论】:

  • 我们无法为您提供我们看不到的代码。 :-) 请用minimal reproducible example 更新您的问题以证明问题。 (这可能就是为什么有人不赞成这个问题。)

标签: javascript typescript interface


【解决方案1】:

An Object is not a Map。您需要自己在Objects 和Maps 之间进行转换:

function objectToMap<K extends string, V>(obj: Record<K,V>): Map<K, V> {
  // return new Map(Object.entries(obj)); 
  const map = new Map<K, V>();
  Object.keys(obj).forEach((k:K) => map.set(k, obj[k]));
  return map;
}

function mapToObject<K extends string, V>(map: Map<K, V>): Record<K, V> {
  const obj = {} as Record<K, V>;
  map.forEach((v, k) => { obj[k] = v; });
  return obj;
}

所以你可以这样做:

let obj =
  {
    firstArg: "first",
    secondArg: objectToMap({ one: 1, two: 2 })
  }


let exm: example = obj; // works now
exm.secondArg.values().next()

使用objectToMap()mapToObject() 之类的东西,您需要编写代码,在您获取/发送的JSON 和包含Maps 的数据模型之间进行转换。希望有帮助;祝你好运!

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2021-04-19
    • 2020-03-04
    • 2020-02-20
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多