构建时Object类型上不存在Angular 4属性

cel*_*ade 31 typescript angular

我正在使用Angular构建一个项目,我使用angular-cli启动了项目,当我尝试运行时,ng build --prod我不断收到此错误:

类型Object上不存在属性'description'

生成此错误的代码如下:

export class AppComponent {
    product: Object = {};

    constructor(
        private store: StoreService,
        private request: RequestService,
    ) {
        this.product = this.request.getProduct(_id);
    }
}

<p>{{product.description}}</p>
Run Code Online (Sandbox Code Playgroud)

我正在阅读有关此内容的一些内容,错误是因为我使用类型定义将产品定义为Object,但我没有传递任何属性定义.

我知道我可以定义一个接口,就像我使用数组一样,但是我无法做到.我不知道我是否定义错了,这是我尝试的方式:

export interface ProductInterface {
    id: Number;
    description: String;
    title: String;
}

product: Object<ProductInterface> = {};
Run Code Online (Sandbox Code Playgroud)

但它也给了我错误.我需要做些什么才能避免这种情况?

LLa*_*Lai 19

第一个例子.在您的html中,您说产品具有属性描述(它不在Object类型上)

在你的第二个例子中.您最初将产品定义为空对象

product: ProductInterface = {};
Run Code Online (Sandbox Code Playgroud)

哪个缺少接口的必填字段.所以你可以删除初始化,离开

product: ProductInterface;
Run Code Online (Sandbox Code Playgroud)

另外正如其他人所说,您不需要Object <>语法

  • @NikhilRadadiya如果您的对象中有未知属性,您可以添加动态属性`product:{[key:string]:string}`这将允许您使用值(类型字符串)为对象分配任何键(类型字符串) .这称为索引签名(https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html) (2认同)

sil*_*R.D 9

从我的情况..

ngOnInit(){
    this.product = this.request.getProduct(_id); // who is _id
} 
Run Code Online (Sandbox Code Playgroud)

只需添加数据:订阅中的任何内容都可以正常工作。

this.request.getProduct(_id).subscribe((data: any) => {
   this.product=data;
});
Run Code Online (Sandbox Code Playgroud)

当响应数据具有更多键值对时,这将很有帮助。(因此创建界面很困难/耗时。)

但最好的做法总是使用接口;)


Kir*_*ili 8

如果属性是动态的(在编译时未知),您可以使用

someObject['someProperty']
Run Code Online (Sandbox Code Playgroud)

代替

someObject.someProperty
Run Code Online (Sandbox Code Playgroud)


cra*_*ash 5

首先,我会简单地使用它product: ProductInterface;,你甚至不需要初始化它。

那么,这可能会解决你的错误{{ product?. description }}