【问题标题】:Assign Dynamic api reponse to typescript interface将动态 api 响应分配给打字稿接口
【发布时间】:2019-07-13 19:17:27
【问题描述】:

我是 typscript 和 nodejs 的新手。我正在尝试分配一个响应,从 restful api 调用中获取它到 typescript 接口。我不想使用 Object.keys 或 Obejct.values 来获取所需的数据,但尝试使用 typecirpt 接口。

这是回复,

// this is dynamic in nature
{ 
  return: [{ 
      'domain1.com': true, 
      'domaim2.com': true, 
      'domain3.com': true 
      }]
} 

域名键值不限于 3 ,可能是 n 。上面的响应甚至不是 json,但这就是我从响应中得到的。

我正在使用下面的ts接口来分配响应。

 export interface ResponseString {
     Res: string;
 }

 export interface ServerRes {
         return: ResponseString[];
 }

try {
       data =  await getServerResponse();
   }
   catch (e) {
       console.error(e);
       throw new Error("Exception: failure ..");
   }
   try {
       const Servers: string[] = Object.keys(data.return[0]); // I want to use tyscrpit interface instread of object.keys to get the domains 

       for (const server of Servers) {
           // to be done
   }
   catch(e) {
        console.error(e);
   }

请分享您对如何完成此操作的意见。

[更新]

我还收到了类似下面的其他 API 响应,

{ return: [ 
    { 'domainroot.com':'domain1.com' : ['some valu, 'some other value'] } 
]}

这些响应也是动态的,但只有键值变化,而 hte 对象没有变化,就像

{ ret: [ {'df':'df' : [ 'df', 'dfd']}]}

谢谢,

【问题讨论】:

  • return is a reserved keyword。除了实际“返回”之外,用于其他东西不是一个好主意
  • 好的,改为 retval 但我不确定如何将 {'key':true, 'key2',ture ......} 映射到接口。
  • 为什么不想使用 Object.keys?这是枚举对象动态键的标准方法
  • 我正在尝试通过到处使用接口来使其结构化。

标签: javascript typescript


【解决方案1】:

这是类型定义

interface ServerResponse  {
  ['return']: { [k: string]: boolean }[]
};

let r: ServerResponse = { 'return':[ { 'domain1.com': true,'domaim2.com': true,'domain3.com': true } ] }

无论如何你必须使用 Objects.keys 来枚举服务器

【讨论】:

  • 谢谢你的回答我会试试这个。
  • 你说得对,我们需要使用 Object.keys 或 Object.values
  • 上面的代码不能很好地满足要求,但我知道我们必须使用 Object、keys 或 Object.values 来获得目前无法分配给接口的动态响应。所以接受这个作为答案。
【解决方案2】:

你需要定义一个带有签名string: boolean的接口

const data = {
  "retval": [{
    "domain1.com": true,
    "domaim2.com": false,
    "domain3.com": true
  }]
};

interface ServerStatusList {
  [key: string]: boolean;
}

const servers: ServerStatusList = data.retval[0];


for (let server in servers) { 
  console.log(`server ${server} : ${servers[server]}`);
}

Try it in the Typescript Playground

【讨论】:

  • 谢谢你的回答我会试试这个。
  • 我在 typescript 中遇到编译问题,其余代码也得到响应,这些也是动态的,与上面的示例略有不同。在这种情况下,我选择 /forced 使用 Obejct.keys 或 Object.values,我在代码中使用的所有内容都是键入的。在上面的示例中,没有输入数据我认为这就是为什么我在尝试移植此示例代码时遇到错误。
  • 如果您的问题中没有正确的代码,我们看不出有什么问题。
  • 你的代码更新没有任何意义。 {'df':'df' : [ 'df', 'dfd']} 不是有效的 javascript 对象或 JSON
  • 是的,它不是有效的 json 或 javascript 对象。即使是有问题的第一个示例也不是有效的响应。有人从 stackoverflow 进行了审查并纠正了它。
猜你喜欢
  • 2020-01-13
  • 2019-10-11
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
相关资源
最近更新 更多