Typescript 3.7@beta Optional Chaining 操作符使用问题

Mur*_*NER 22 javascript typescript uri.js

我正在尝试打字稿可选链接运算符,但抛出了这个异常。

index.ts:6:1 - error TS2779: The left-hand side of an assignment expression may not be an optional property access.
Run Code Online (Sandbox Code Playgroud)

我的示例代码如下

const url = URI({
    protocol: 'http',
    hostname: 'example.org' 
})

// This line throwed
document.getElementById('output')?.innerHTML = url.toString()
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

iam*_*gga 27

const output = document.getElementById('output');
if (output) output.innerHTML = url.toString()
Run Code Online (Sandbox Code Playgroud)

此运算符用于访问深嵌套值。

我们来看看document.getElementById('output')?.innerHTML。这将返回undefined(如果 '#output' 不存在)或string(如果 '#output' 存在)。而你试图分配string给它。

在这里,您尝试为可能不存在的对象属性设置新值。

所以是的,在赋值的左侧不能使用可选的属性访问。

您可以在提案中阅读更多相关信息

  • 我不认为类型是这里的问题,因为您当然可以将“string”类型的值分配给“string |”类型的可写变量或属性。未定义`。问题是 `foo?.bar` 根本不可写,因为它相当于 `foo == null ? undefined : foo.bar`,你不能写入它,即使使用 `undefined` 也是如此。 (2认同)
  • @jcalz,是的,当然,我只是试图以某种方式解释,这里我们正在尝试为某个对象的属性赋值,该属性可能不存在。更新 (2认同)

Nit*_*Jha 18

objectVariableName!.propertyName = 'some value to assign';
Run Code Online (Sandbox Code Playgroud)

请注意感叹号,即!

  • 这怎么称呼?这是 ECMAScript 实现吗? (4认同)
  • @Dazag 看起来它是一个非空断言运算符 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator (2认同)
  • 这是一个很好的答案。有助于代码的可读性。感谢您 (2认同)
  • 仅当您确定 objectVariableName 存在时,这才是好的,您基本上告诉编译器不要担心这是未定义的。但如果它是未定义的,你会得到一个错误 (2认同)