`?` 在某些对象属性之前是什么意思?为什么我的 ts 文件不接受它?

Mat*_*ins 3 html javascript conditional-statements typescript angular

*ngIf当我有一个可能未定义的对象或所需对象之外的对象时,我总是在角度指令中使用这种行为显示

<div *ngIf="object?.foo">
  ...
</div>
Run Code Online (Sandbox Code Playgroud)

我知道这有效,但不知道为什么...

但是,当我尝试在我的TypeScript文件中的 if 上使用它时,如以下 angularTS1005, TS1109在我尝试使用此行为的每一行上,向我抛出两个不同的错误,相互交替。

if(object?.foo){} // error TS1109
if(object?.foo){} // error TS1005
if(object?.foo){} // error TS1109
if(object?.foo){} // error TS1005
Run Code Online (Sandbox Code Playgroud)

我在这个项目中使用 Angular 7.3.9

Ant*_*neB 9

它在您的模板中工作的原因是因为 angular 会将其计算为以下表达式:

<div *ngIf="object && object.foo">
Run Code Online (Sandbox Code Playgroud)

如果对象为空,这将防止在对象上调用属性的错误。

文档链接:https : //angular.io/guide/template-syntax#the-safe-navigation-operator----and-null-property-paths

它在组件的打字稿部分不起作用,因为打字稿不支持它。

?打字稿中for 变量的唯一用途是指定方法的参数是可选的:

function myFunc(mandatoryParam: any, optionalParam?: any) {
    ...
}

myFunc('hello'); // Will work
myFunc('hello', 'world'); // Will work too
Run Code Online (Sandbox Code Playgroud)

正如对此答案的评论中所述,TypeScript 将在 3.7 版本中添加对 angular 模板语法的支持:https : //www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#可选链

  • 是的,我在答案中添加了链接:) (2认同)