網站搜尋

angular - 將參數轉換為內部類別


我在我的組件中定義了一個內部類來保存視圖模型,我需要將 HTTP 回應介面轉換為這個視圖模型。我嘗試了這種方法:

@Component({
  selector: 'app-tasklist-items-grid',
  templateUrl: './tasklist-items-grid.component.html',
  styleUrls: ['./tasklist-items-grid.component.scss'],
  providers: [TasklistItemsService, BsModalService]
})
export class TasklistItemsGridComponent implements OnInit {

// .....

  TaskListItemViewModel = class {    
    id?: number;
    tasklistId: number;
    typeOfTask: number;
    statusId: number;
    created_at: Date;
    updated_at: Date;
    checked: Boolean;
    rowVersion: number;
  }

  convertToViewModel = (item: TaskListItemViewModel) => item;
}

然而,找不到 TaskListItemViewModel 類型。我也嘗試將內部類別和方法都定義為 static,但仍然無法工作。

我錯過了什麼?

答案#1

我認為你可以在組件外聲明你的模型介面,在組件內僅創建實現該介面的嵌套類(也就是類表達式)。然後你可以在類表達式中添加你的方法。

import { Component } from '@angular/core';

export interface MyInterface {
  id?: number;
  tasklistId: number;
  typeOfTask: number;
  // other properties
}
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  TaskListItemViewModel = class implements MyInterface {
    constructor(
      public id: number,
      public tasklistId: number,
      public typeOfTask: number
    ) {}
    // other methods which you want to implement
  }

  convertToViewModel = (item: MyInterface) => new this.TaskListItemViewModel(1, 2, 3);
}

當然,這個例子展示了 TypeScript 的強大(在這個例子中,我們看到 Class expressions 的特性),但我不會在真正的專案中這麼做,因為大多數流行的風格指南建議將類別/介面/枚舉...(也就是模型)宣告在獨立的檔案中,通常是 some-feature.model.ts。然後我們可以在應用程式的其他部分使用這些模型,例如元件、指令等。

答案#2

你需要在 TasklistItemsGridComponent 外部定義這個類,語法如下,但如果你想創建嵌套類,你需要遵循鏈接中使用的解決方案:Any way to declare a nest class structure in typescript?

class TaskListItemViewModel { 
  id?: number;
  tasklistId: number;
  typeOfTask: number;
  statusId: number;
  created_at: Date;
  updated_at: Date;
  checked: Boolean;
  rowVersion: number;
  }

@Component({
  selector: 'app-tasklist-items-grid',
  templateUrl: './tasklist-items-grid.component.html',
  styleUrls: ['./tasklist-items-grid.component.scss'],
  providers: [TasklistItemsService, BsModalService]
  })
export class TasklistItemsGridComponent implements OnInit {
   convertToViewModel = (item: TaskListItemViewModel) => item;
}