内联Partial <t>仍然抱怨缺少字段?

时间:2018-12-12 18:13:35

标签: angular typescript

使用TypeScript〜3.1.6,我声明了以下接口:

export interface Shop {
  readonly displayName: string;
  name: string;
  city: string;
}

其中displayName由后端设置,而不能由UI更改。

我创建了以下服务来创建一个新商店,其REST以cityname作为属性:

createShop = (shop: Partial<Shop>) =>
  this._http.post(`/shop/new`, shop, this._options)
    .pipe(
      catchError(this.handleError)
    );

然后我通过Angular 7反应形式传递数据:

createShop = () =>
  this._shopService.createShop({
    name: this.form.get('name').value,
    city: this.form.get('city').value
  }).subscribe(/* handlers */);

我已将create方法的shop声明为Partial<Shop>,因为我不想维护单独的<CreateShop>接口,我认为这正是Partial<T>的目的

但是,我仍然在编译时收到此错误:

src/app/addShop.component.ts(39,40): error TS2345: Argument of type '{ name: string; city: string; }' is not assignable to parameter of type 'Shop'.
  Property 'displayName' is missing in type '{ name: string; city: string; }'.

如果我声明

export interface CreateShop extends Partial<Shop> {}

并使用它而不是Partial<Shop>进行编译。

为什么不能使用内联Partial声明?

尤其是这似乎与Partial<T> only works with inline values完全相反

1 个答案:

答案 0 :(得分:2)

您可以通过将对象文字转换为Shop

来解决此问题。
createShop = () =>
  this._shopService.createShop({
    name: this.form.get('name').value,
    city: this.form.get('city').value
  } as Shop).subscribe(/* handlers */);