typescript 类型“boolean”不能赋给类型“number”

ajsxfq5m  于 2023-01-03  发布在  TypeScript
关注(0)|答案(2)|浏览(352)

我正在寻找这个问题的答案,但我找不到它。所以,我有这个界面:

export interface productsListFromOrder{
  product_name: string,
  amount: number,
  price: number,
}

我创建了一个对象数组然后按下

products:productsListFromOrder[] = []; //productsListFormOrder is my interface
  myFunction(): void{
//...
        this.products.push({
          product_name: product?.name!,
          price: product?.price!,
          amount: element.amount ? parseInt(element.amount) : 1
        })
}

问题是,我有一个错误的标题:
类型'boolean'是不能赋值给类型'number'我确信该类型是正确的,因为我测试了几件事:
1.我显示价格类型,它显示编号
第一个月
1.我在任意[]上设置了产品类型数组,它工作正常,但我想使用我的接口
products:productsListFromOrder[] = [];
1.我用这种方法解决这个问题
regular_price: typeof product?.price! == 'boolean' ? 0 : product?.price!,
好吧,如果我使用方法2或3,我的代码可以工作,但它不是我的目标。我需要使用我的接口(而不是像第2点中的任何[]),第3点中的代码很难看。那么最重要的-为什么我会出现这个错误?Product.price有一个类型号。我怎么能在不检查类型的情况下编写这个代码呢?

k97glaaz

k97glaaz1#

TypeScript中的感叹操作称为"非空Assert操作符" this question,答案提供了关于其含义的深入探讨。
执行此操作时:

product?.name!,

这是不正确的。因为您在感叹号运算符(Assertproduct?.name不是null或undefined)之前使用了问号运算符(可能允许product?.name为null或undefined)。
我相信您已经禁用了一些类型脚本验证,否则您将收到以下错误:
product?.name!
TSLint:禁止的非空Assert(no-non-null-assertion)
具有小写的接口名称productsListFromOrder
TSLint:类名必须为pascal大小写
第二个问题是jcalz注解中指出的一个简单修复,将其更改为ProductsListFromOrder
关于错误"类型'boolean'不可分配给类型'number'"
我建议您在这里使用变量product

this.products.push({
          product_name: product?.name!,
          price: product?.price!,
          amount: element.amount ? parseInt(element.amount) : 1
        })

不知何故,它的price属性有一个隐式接口as boolean,这反过来又导致了你所得到的错误。
为了解决这个问题,

选项1(丑陋)

可以将price的值粗略调整为number:

price: <number><unknown>product?.price,

选项2(我的建议)

您应该调整变量product,使其永远无法为其price属性提供布尔接口。

yvt65v4c

yvt65v4c2#

在模板中,单击 * ngx-shimmering-loader * 的isVisible属性。Angular 语言服务将转到ngx-shimmering-loader文件......如果没有,请重新安装Angular 语言服务并重新启动IDE。在ngx-shimmering-loader文件中,将isVisible:字符串;到可见:布尔型
这对我很有效。

相关问题