使用TypeScript〜3.1.6,我声明了以下接口:
export interface Shop {
readonly displayName: string;
name: string;
city: string;
}
其中displayName
由后端设置,而不能由UI更改。
我创建了以下服务来创建一个新商店,其REST以city
和name
作为属性:
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完全相反
答案 0 :(得分:2)
您可以通过将对象文字转换为Shop
createShop = () =>
this._shopService.createShop({
name: this.form.get('name').value,
city: this.form.get('city').value
} as Shop).subscribe(/* handlers */);