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

disho6za  于 2023-10-22  发布在  TypeScript
关注(0)|答案(9)|浏览(186)

我正在使用Angular构建一个项目,我使用angular-tool启动了这个项目,当我尝试运行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>

我阅读了一些关于这个的内容,错误是因为我使用类型定义将产品定义为对象,但我没有传递任何属性定义。
我知道我可以定义一个接口,就像我对数组所做的那样,但我不能这样做。我不知道我是不是定义错了,我是这样尝试的:

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

product: Object<ProductInterface> = {};

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

niknxzdl

niknxzdl1#

对于你的第一个例子。在你的html中,你说产品有属性描述(它没有对象类型)
在第二个例子中。您最初将product定义为空对象

product: ProductInterface = {};

它缺少接口的必需字段。因此,您可以删除初始化,

product: ProductInterface;

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

ua4mk5z4

ua4mk5z42#

从我的案子里...

ngOnInit(){
    this.product = this.request.getProduct(_id); // who is _id
}

只是添加数据:订阅时的任何都可以正常工作。

this.request.getProduct(_id).subscribe((data: any) => {
   this.product=data;
});

当响应数据具有更多的键、值对时,这将很有帮助。(所以创建接口很难/很耗时。)
但最好的做法总是使用接口;)

dly7yett

dly7yett3#

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

someObject['someProperty']

而不是

someObject.someProperty
axkjgtzd

axkjgtzd4#

首先,我会简单地使用product: ProductInterface;,你甚至不需要初始化它。
然后,这可能会修复错误{{ product?. description }}

6ie5vjzr

6ie5vjzr5#

您必须在OnInit方法中定义请求,控制器实现OnInit接口并定义新方法

ngOnInit(){
    this.product = this.request.getProduct(_id); // who is _id
}

假设getProduct()是返回一个observable

this.request.getProduct(_id).subscribe((data) => {
   this.product=data;
});
prdp8dxp

prdp8dxp6#

当从服务器请求数据时,使用any而不是Object是安全的,因为我们不知道从服务器返回什么。所以你不需要typecheckie:

export class AppComponent {
    product: any;

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

jslywgbw7#

如果你使用ng serve命令,编译成功。
梅,你在构建配置上遇到了麻烦
也许你需要修改className.prod.tsclassName.ts
我的另一个答案有更多的细节:
Angular - How to fix 'property does not exist on type' error?

ajsxfq5m

ajsxfq5m8#

在Angular 16中,其他解决方案都不起作用。
幸运的是,documentation很清楚这一点:可以使用$any(...)

{{ $any(product).unknownProperty }}
wvt8vs2t

wvt8vs2t9#

在我的例子中,它在将我的属性设置为public后工作
所以,只要改变这个

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

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

相关问题