如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?

Posted

技术标签:

【中文标题】如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?【英文标题】:How to assign an HttpResponse response of custom array of objects returned from webapi to an object of same array type in typescript angular? 【发布时间】:2022-01-21 04:45:48 【问题描述】:

我第一次在 VSCODE 中使用带有 angular 的 asp.net 核心,从事视频教程中的一个小项目。下面是我的组件打字稿文件 - index-actors.component.ts

    import  actorDTO  from './../actors.model';
import  ActorsService  from './../actors.service';
      import  Component, OnInit  from '@angular/core';
import  HttpResponse  from '@angular/common/http';

      @Component(
        selector: 'app-index-actors',
        templateUrl: './index-actors.component.html',
        styleUrls: ['./index-actors.component.css']
      )
      export class IndexActorsComponent implements OnInit 

        constructor(private actorService:ActorsService)  
        actors!: actorDTO[];
        colunsToDisplay=['name','actions'];
        totalAmountOfRecords: string | null | undefined;
        currentPage=1;
        pageSize=5;
        ngOnInit(): void 
          this.actorService.get().subscribe((response:HttpResponse<actorDTO[]>)=>
          this.actors=response.body;
          this.totalAmountOfRecords=response.headers.get("totalAmountOfRecords");
          );
        

        delete(id:number)

        

      

我在线路上遇到错误

this.actors=response.body;

错误提示

错误:键入 'actorDTO[] | null' 不能分配给类型 'actorDTO[]'。 类型“null”不能分配给类型“actorDTO[]”。 21 this.actors=response.body;

我似乎不知道如何解决这个问题。为什么可以将具有 actorDTO[] 数组的响应体直接分配给本身就是 actorDTO 数组的actor?

tsconfig.json

    /* To learn more about this file see: https://angular.io/config/tsconfig. */

  "compileOnSave": false,
  "compilerOptions": 
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2017",
    "module": "es2020",
    "lib": [
      "es2018",
      "dom"
    ]
  ,
  "angularCompilerOptions": 
    "enableI18nLegacyMessageIdFormat": false,
    "strictInjectionParameters": true,
    "strictInputAccessModifiers": true,
    "strictTemplates": true
  

actors.services.ts

      import  observable, Observable  from 'rxjs';
  import  environment  from './../../environments/environment';
  import  HttpClient  from '@angular/common/http';
  import  actorCreationDTO, actorDTO  from './actors.model';
  import  Injectable  from '@angular/core';
  import  formatDateFormData  from '../utilities/utils';

  @Injectable(
    providedIn: 'root'
  )
  export class ActorsService 

    constructor(private http:HttpClient)  
    private apiURL=environment.apiURL+"/actors";

    get(): Observable<any>
    return this.http.get<actorDTO[]>(this.apiURL, observe:'response');
    
    create(actor: actorCreationDTO)
      const formData= this.buildFormData(actor);
      return this.http.post(this.apiURL,formData);
      
    private buildFormData(actor:actorCreationDTO) : FormData
      const formData=new FormData();
      formData.append('name',actor.name);
      if(actor.biography)
        formData.append('biography',actor.biography);
      
      if(actor.dateOfBirth)
        formData.append('dateOfBirth',formatDateFormData(actor.dateOfBirth));
      
      if(actor.picture)
        formData.append('picture',actor.picture);
      
  return formData;
    
  

【问题讨论】:

能否请您发布您的tsconfig.json 文件? @Chaka15 完成...更新 在您的 tsconfig 中设置了严格类型。在你的组件中,如果你把actors!: actorDTO[] | null 错误应该消失。 【参考方案1】:

尝试删除strict: true,并在https://www.typescriptlang.org/tsconfig 阅读更多相关信息。这个选项strict 设置为false 迫使你在类中声明属性时输入!,老实说有时很烦人。 :)

还可以考虑将strictNullCheks: false 添加到您的tsconfig.json

更多可能有用的选项是this.actors = response.body || [];

【讨论】:

【参考方案2】:

在您的 tsconfig 中,默认设置了严格类型。如果您查看 HttpResponse 的 Angular 文档,body 的类型是 T | null。所以响应正文可能是actorDTO[] | null

由于设置了严格类型,您需要考虑响应正文中潜在的 null 情况。

选项 1

输入你的actors属性来说明null

// IndexActorComponent
actors!: actorDTO[] | null;

选项 2

如果响应正文为空,请使用|| 分配一个空数组。通过这种用法可以让你的演员输入为actors!: actorDTO[]

this.actors = response?.body || [];
https://angular.io/api/common/http/HttpResponse https://angular.io/guide/strict-mode https://indepth.dev/posts/1402/bulletproof-angular

【讨论】:

我也是打字新手。开发环境中通常的标准值严格类型是什么?应该将其删除还是设置为 false? 因为 Angular 11 strict 在所有新项目上默认启用。严格模式为您的项目添加了额外的类型安全功能。如果您想使用它,这是个人选择。我相信建议保持启用但不是强制性的。检查我的编辑以获取有关严格模式的几篇文章的链接。

以上是关于如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?的主要内容,如果未能解决你的问题,请参考以下文章

GWT 返回从外部 jar 实现接口的自定义对象

如何在数组的自定义类对象中使用 DefineProperties - Delphi

将返回的 Observables 转换为角度的自定义类数组

webapi 实现特效路由的自定义约束 大写约束

在 asp.net WebAPI 中返回数组对象

如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?