【问题标题】:Angular/TS: how to get the values of properties from partial extended interface?Angular/TS:如何从部分扩展接口获取属性值?
【发布时间】:2021-04-07 04:14:52
【问题描述】:

对 Angular/TS 非常陌生,也许我的措辞有误,但我会尽力解释。

我有 2 个接口,一个像这样扩展另一个:

export interface CustomerModel {
   firstName: string;
   lastName: string;
    //other things
}

export interface OrderModel extends Pick<CustomerModel, 'firstName' | 'lastName' {
  orderNumber: number;
}

我创建了一个带有硬编码客户实例的服务(在机器上本地工作,现在所有内容都是硬编码的。我最终将使用 DB,但我需要首先以这种方式工作)

export class CustomerService {
  customers: CustomerModel[];
  constructor() {
    this.customers = [{
     firstName: 'John',
     lastName: 'Doe',
    //more here 
       },
{
     firstName: 'Jane',
     lastName: 'Smith',
    //more here 
       },
     ]
   }

   getCustomers(): Observable<CustomerModel[]> {
    const customers = of(customers);
    return customers;
 }
}

现在我正在尝试使用 OrderModel 创建一个订单服务

export class OrderService {
  orders: OrderModel[];
  constructor() {
    this.orders = [{
     orderNumber: 123;
     firstName: ???, //what do I put here to pick up the name from CustomerModel
     lastName: ???,
       },
     { 
    //more here 
       },
     ]
   }

   getOrders(): Observable<OrderModel[]> {
    const orders = of(orders);
    return orders;
 }
}

当我将鼠标悬停在我的 orderservice 中 firstName 的值上时,它确实说它来自 CustomerModel,所以我知道扩展的工作。
如果我将 firstName 和 lastName 留在 orders 数组之外,我会收到一条错误消息,指出 OrderModel 正在等待它们。 也许这是不可能的,并且可能有更好的解决方案,但我一直在兜圈子试图看看这是否有效。 谁能帮我从 CustomerModel 中获取属性 firstName/lastName 的值?

【问题讨论】:

  • 可能会改变 OrderModel extends Pick
  • 对不起,这是一个错字,它设置为那个。我的问题是我应该为 firstName 输入什么以便它从 CustomerModel 中获取 firstName?
  • OrderModel 应该有 Customer Id 而不是 firstName 和 lastName。因此,Customer Model 应该有一个 Id 字段。像这样给出 0 , 1, 2 并在 OrderModel 中给出相同的客户 ID 而不是 firstName 和 lastName 。
  • 如果我理解正确,您希望从一项服务复制数据,但为每个项目添加 ID?还是您有智能感知问题?
  • @AdityaYada 是的。我必须有一个 firstName/lastName 的值,但我希望它是 customerModel 中的名称。我不知道在 orderService 中放什么,以便它在订单上选择“John Doe”。

标签: angular typescript angular10


【解决方案1】:

在这种情况下,您最好的选择是拥有一个单独的文件来保存用户的所有基本数据,然后将其转换为您以后需要的任何内容。

// app/some-folder/customers.ts
export const customers: CustomerModel[] = [
  {
    firstName: 'John',
    lastName: 'Doe',
    //more here 
  },
  {
    firstName: 'Jane',
    lastName: 'Smith',
    //more here 
  },
];

在服务中

import { customers } from '@app/some-folder/customers.ts'

export class CustomerService {

  public getCustomers(): Observable<CustomerModel[]> {
    return of(customers);
  }

}
import { customers } from '@app/some-folder/customers.ts'

// map the existing customers, and transform it to also have an orderNumber
// use ...a, orderNumber: i to merge the whole customer add orderNumber together
const orders: OrderModel[] = customers.map((a, i) => ({
  firstName: a.firstName,
  lastName: a.lastName,
  orderNumber: i,
}))

// or you can do this, which is more in-line with how an API would respond
// generally an order would just include the customerId, or have a customer object
// const orders = customers.map((a, i) => ({ customer: a, orderNumber: i }))


export class OrderService {

  public getOrders(): Observable<OrderModel[]> {
    return of(orders);
  }

}

这样,当您实现 API 时,您所要做的就是换掉函数的主体。

【讨论】:

  • 这给了我完整的客户。这适用于部分客户吗?我可以只带入我需要的 2 个属性而不是完整模型吗?我收到错误,它缺少一堆字段
  • @SiobhanHolubicka 更新了代码以演示仅采用特定属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多