繁体   English   中英

可能具有不同于API返回值的Typescript接口?

Possible to have a Typescript interface that differs from what the API returns?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想这是一个通用的编程问题,但是对于AJAX类型的东西,我基本上还是一个初学者。

假设我正在使用一个API,在这些API中,创建者并不在乎好好命名(或者至少不是我的方式命名),这样响应看起来像这样:

{
  data: [{
    sdt: '2018-10-12',
    firstnm: 'Stevo',
    pos: 'Assistant to the Manager'
  }]
}

但我希望我的界面使用camelCase约定具有更清晰的名称,如下所示:

export interface IHiringData {
  startDate: string,
  firstName: string,
  position: string
}

这可能吗? 还是我坚持定义一个模仿API返回值的接口? 如果可以使用所需的接口,将返回的数据映射到Typescript接口的一种好方法是什么?

2 个回复

一种解决方案是简单地将JSON数据映射到与您的接口匹配的新对象。

export interface IHiringData {
  startDate: string
  firstName: string
  position: string
}

const json = {
  data: [{
    sdt: '2018-10-12',
    firstnm: 'Stevo',
    pos: 'Assistant to the Manager'
  }]
}

const hiringData: IHiringData[] = json.data.map(x => ({
  startDate: x.sdt,
  firstName: x.firstnm,
  position: x.pos
}))

另一个解决方案是使用JSON Reviver函数将某些键重新映射为更好的名称:

interface Employees {
  data: Employee[];
}

interface Employee {
  startDate: string;
  firstName: string;
  position: string;
}

const json = `{
  "data": [{
    "sdt": "2018-10-12",
    "firstnm": "Stevo",
    "pos": "Assistant to the Manager"
  }]
}`

const remapKeys = {
  "sdt": "startDate",
  "firstnm": "firstName",
  "pos": "position"
}

function reviver(this: any, key: string, val: any) {
  if (key in remapKeys)
    this[remapKeys[key as keyof typeof remapKeys]] = val;
  else
    return val;
}

const obj: Employees  = JSON.parse(json, reviver);

结果:

{
  data: [
    {
      startDate: "2018-10-12",
      firstName: "Stevo",
      position: "Assistant to the Manager"
    }
  ]
}

示例: 游乐场链接

这种方法的一个可能优势是,您可以解析一棵大的JSON数据树,并且无论在何处找到键,键都将被重新映射。

对于任何解决方案,请注意JSON.parse()返回any并且不能保证您的映射实际上与您的接口匹配。 为了达到该安全级别,您需要编写一个完整的反序列化程序,对意外或丢失的数据引发错误。

2 为何回声$? 返回不同于预期的值?

我知道echo $? 返回上一个进程的退出状态。 在我的计划,我得到0 ,如果我的程序用的状态代码结束0 。 但当程序以状态码-1 echo $? 显示255 。 StackOverflow上有类似的问题,但没有解释为什么会这样。 另外一个答案说通常高于128值表示一些错误和负退出代 ...

4 EF返回的值不同于查询

所以我只是遇到了这个非常奇怪的场景,并想知道是否有人可能知道问题是什么。 我有以下EF Linq查询。 当我在调试器中检查该查询时,它显示以下SQL 如果我在SQL Server Management Studio中运行它, @p__linq__0使用dashboardId的值 ...

5 NSNumber返回的值不同于原始int

我对objective-c很新,我正在尝试将int转换为NSNumber,以便将其保存到Core-Data中。 我有以下一段代码(索引是一个NSInteger) 然后它回来了 我需要一个2的int被翻译成数字2以及所有其他数字被翻译成正确的数字......有谁能告诉我为什么 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM