仅发送 Angular 中嵌套模型的模型 PK(或任何其他字段)

Send just the model PK (or any other field) for nested model in Angular

具有以下示例模型:

interface User {
  id: string
  organization: Organization
}

interface Organization {
  id: string
}

当我发送请求时,例如:

const user = new User("abc", new Organization("xyz"))
httpClient.post<User>(url, user)

可以理解,看起来像这样:

{
  "id": "abc",
  "organization": {
    "id": "xyz"
  }
}

我怎样才能发送如下所示的请求?

{
  "id": "abc",
  "organization": "xyz"
}

我希望在 HttpClient 中有某种机制来转换请求,但我找不到任何东西。

另一种方法是将 User 转换为普通 JS 对象并对其进行操作,但我不知道该怎么做:

const user = new User("abc", new Organization("xyz"))
const data = Object.assign({}, user);

data.organization = data.organization.id; // error, can’t assign string to Organization

所以data仍然是一个User,而不是一个普通的JS对象。

实现它的最佳方法是什么?

So data is still a User, not a plain JS object.

您正在创建一个 User 实例来发送数据,对象数据的类型始终为 User

如果你想发送普通对象,解构对象并创建一个对象字面量:

const org = new Organization("xyz"), 
      user = new User("abc", {organization: org.organization.id}),             
      {id, organization} = user,
      payload = {id, organization};

// why do you need to create org or user if you can directly assign and create an object like this

// const payload = {id: "abc" , organization: "xyz" };
httpClient.post<User>(url, payload)

我找到了一种解决方案,但不是 100% 满意。暂时不接受,万一有人能提供更好的呢

编辑:标记为已接受的答案。

const user = new User("abc", new Organization("xyz"));

// clone the `user` object as I don’t want to modify the original
// (this step is optional)
const data = Object.assign({}, user);

// overwrite the `organization` property on the object
// with the value of `organization.id`
Object.assign(data, { organization: data.organization.id });

httpClient.post<User>(url, data)

为了保持干净,我将它作为方法添加到 User class:

class User
{
    constructor(
        id: string,
        organization: Organization
    ) { }

    asRequestData()
    {
        const data = Object.assign({}, this);
        Object.assign(data, { organization: data.organization?.name });

        return data;
    }
}

httpClient.post<User>(url, user.asRequestData())