将大json对象映射到typescript中的模型对象

时间:2017-02-17 12:06:29

标签: reactjs typescript

我有对象数组,每个对象都包含;

{
 Id:"..",
 name:"..",
 foo1:"..",
 foo2:"..",
 ...
}

我只需要这些项目的2个属性,所以我创建了一个界面;

export interface IMenuModel{
    Id:number;
    name?:string;    
}

并在此方法中检索数据:

 fetch(`..`).then((response: Response): Promise<{ value:IMenuModel[] }>  => {
                  return response.json();
                })
                 .then((response: { value: IMenuModel[] }): void => {
                   debugger //expected response is array of IMenuModel but it still contains all properties

我希望这个响应对象是我的自定义模型(IMenuModel)的数组,但它仍然包含从远程源检索的所有属性。

我可以用#34; .map()&#34;函数没问题,但有返回类型定义为函数(response: { value: IMenuModel[] })所以我不应该这样做(或者每次都必须手动映射)。

为什么仍然没有在我的对象模型中做出响应并且最有效的方法是什么呢?

1 个答案:

答案 0 :(得分:1)

TypeScript主要是JavaScript之上的类型层。这些类型不会更改键入的对象。当转换成JavaScript时,输入就会被删除。如果将接口(或多个接口)应用于JSON对象,则不会更改对象的性质,只需声明该接口的保证。

因此,当您定义<?php namespace ImportBundle\Repository; use Doctrine\DBAL\Query\QueryBuilder; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Tools\Pagination\Paginator; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class TaxrefRepository extends EntityRepository { /** * Pagination liste des especes * @param int $page * @param int $max * @return Paginator */ public function findByPage($page = 1, $max = 8) { if(!is_numeric($page)) { throw new \InvalidArgumentException( '$page must be an integer ('.gettype($page).' : '.$page.')' ); } if(!is_numeric($page)) { throw new \InvalidArgumentException( '$max must be an integer ('.gettype($max).' : '.$max.')' ); } $dql = $this->createQueryBuilder('t'); $dql->orderBy('t.id', 'DESC'); $firstResult = ($page - 1) * $max; $query = $dql->getQuery(); $query->setFirstResult($firstResult); $query->setMaxResults($max); $paginator = new Paginator($query); if(($paginator->count() <= $firstResult) && $page != 1) { throw new NotFoundHttpException('Page not found'); } return $paginator; } /** * @return \Doctrine\ORM\QueryBuilder */ public function distinctTaxref() { return $this ->createQueryBuilder('t') ->select('t.nomVern') ->distinct(true) ->orderBy('t.nomVern', 'ASC'); } } 接口并将其应用于导入的对象时,您会说:&#34;我知道并且我可以保证给定对象提供接口中定义的成员。 &#34; 您的对象满足此保证,因此一切都很好。然而,物体仍在传递和恢复其全部荣耀。将接口视为 minimum 保证,而不是对象的完整描述。

如果您不想要对象的其他成员,您唯一的选择是让服务器仅发送您需要的对象部分。如果您不能这样做,则不必担心,因为您的对象满足界面的最低要求。只需忽略其他值。