打字稿:将 JSON 对象转换为类/接口对象

Nit*_*tin 7 json class typescript angular

我正在尝试将 API 响应转换为打字稿类/接口。

这里 API 返回一个包含一些属性的对象列表,但我只需要响应对象的几个属性。

API 响应示例:

    [{
    '身份证':1,
    '名称': '测试',
    '描述:'测试',
    '属性X':'x',
    '属性Y':'y'
    },
    ...]

打字稿类

    类响应{
     id:字符串;
     名称:字符串;
    }

您能否建议我将 JSON 对象转换为打字稿对象的最佳方法。

klu*_*gjo 6

我建议创建一个接口来描述您在应用程序中使用的属性并忽略其余的:

因此,假设您的响应如下所示:

const response = [{
      'Id' : 1,
      'Name': 'test',
      'Description: 'Test',
      'PropertyX': 'x',
      'PropertyY' : 'y'
    }, {
      'Id' : 2,
      'Name': 'test2',
      'Description: 'Test2',
      'PropertyX': 'x2',
      'PropertyY' : 'y2'
    }
];
Run Code Online (Sandbox Code Playgroud)

并且您只对Idand感兴趣Name,只需创建一个像这样的界面:

interface IMyObject {
  Id: String;
  Name: String;
}
Run Code Online (Sandbox Code Playgroud)

然后在应用程序的其余部分中,您可以将响应转换为 IMyObject[]

例如,如果函数使用您的响应:

function myFunction(response: IMyObject[]) { ... }
Run Code Online (Sandbox Code Playgroud)

或者如果您需要返回该类型,您可以像这样进行直接转换:

return response as MyObject[];
Run Code Online (Sandbox Code Playgroud)

编辑:正如下面的评论中提到的,简单地将您的对象强制转换为IMyObject不会删除您不感兴趣的额外属性。

为此,请使用.map

const formattedResponse: IMyObject = reponse.map(item => {
  Id: item.Id,
  Name: item.Name
});
Run Code Online (Sandbox Code Playgroud)

  • 这绝对不是正确的方法。这可能是一种黑客行为,但这不是它应该如何工作的。因为你的对象仍然包含其他属性,只是对于 TypeScript 它们是不可见的。想象一下将此对象发送到 API,因为您认为其中只有 Id 和 Name,但实际上发送了更多数据。铸造不会删除或更改任何属性。我强烈建议不要使用这种方法 (2认同)