尝试初始化嵌套数组时出错“赋值表达式的左侧可能不是可选的属性访问。”

Posted

技术标签:

【中文标题】尝试初始化嵌套数组时出错“赋值表达式的左侧可能不是可选的属性访问。”【英文标题】:Getting error when trying to initialize nested array "The left-hand side of an assignment expression may not be an optional property access." 【发布时间】:2021-08-30 12:08:20 【问题描述】:

我有一个对象,里面有一个数组,里面还有第二个数组,就像这样。

export class OrdenCompra 
public id?: number,
public insumos?: OrdenCompraInsumo[],


export class OrdenCompraInsumo 
id?: number;
traslados?: IImpuestoTraslado[];


export class ImpuestoTraslado
public id?: number,
public impuesto?: number

我想增加一些价值

特拉斯拉多斯

喜欢这个

const retencion = new ImpuestoRetencion();
ordenCompra?.insumos[index]?.retenciones?.push(retencion); 

但此时

ordenCompra?.insumos[index]?.retenciones?

是的

未定义

所以它永远不会被赋值。

如果我尝试初始化我会得到一个错误。

ordenCompra?.insumos[index]?.retenciones = []

ordenCompra?.insumos[index]?.retenciones = ImpuestoRetencion[];

ordenCompra?.insumos[index]?.retenciones: ImpuestoRetencion[] || [];

上面写着

赋值表达式的左侧可能不是可选的属性访问。

所以我无法为这个数组赋值。我知道这是一个非常微不足道的问题,但即使我搜索了几个小时。

【问题讨论】:

【参考方案1】:

?.,称为optional chaining,仅用于读取/调用,不用于设置。来自docs:

在其核心,可选链让我们编写代码,如果遇到nullundefined,TypeScript 可以立即停止运行某些表达式。

所以你可能会这样理解const foobarbaz = foo?.bar?.baz

// Will have type: undefined | typeof baz
const foobarbaz = foo === undefined || foo === null
                    ? undefined
                    : foo.bar === undefined || foo.bar === null
                      ? undefined
                      : foo.bar.baz

这在集合的上下文中没有意义,因为您不能将 null 或 undefined 设置为值:

foo?.bar?.baz = foobarbaz
// ^^^^^^^^^^ - The left-hand side of an assignment expression may not be
//                an optional property access.

// Practically the same as:
(foo === undefined || foo === null
  ? undefined
  : foo.bar === undefined || foo.bar === null
    ? undefined
    : foo.bar.baz) = foobarbaz

要设置此属性,您必须检查foo.bar.baz 的值是否为空。这可以通过将赋值包装在 if 语句中来完成:

foo.bar.baz = something; // error!

if(foo?.bar?.baz) 
  foo.bar.baz = something; // OK

如果您知道您的值不是 null 或 undefined 但编译器无法自行确定,请使用non-null assertion operator (!.):

foo!.bar!.baz = something; // OK

Here is a playground 演示了这些场景中的每一个。

【讨论】:

谢谢,我只是意识到删除 ?字符允许设置值。

以上是关于尝试初始化嵌套数组时出错“赋值表达式的左侧可能不是可选的属性访问。”的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中初始化对象数组时出错

尝试使用 VBO 时出错“必须禁用数组 vertex_buffer_object 才能调用此方法”

在c ++中初始化构造函数中的c数组时出错

将二维字符串数组传递给函数时出错 (C++)

初始化我的数组时出错

初始化二维数组时出错[重复]