在某个对象属性之前,"?"是什么意思?为什么我的 TS 文件不接受它?



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

<div *ngIf="object?.foo">
...
</div>

我知道这是有效的,但不知道为什么。。。

但是,当我试图在TypeScript文件中的if上使用它时,就像下面的angular一样,在我尝试使用这种行为的每一行上,都会抛出两个不同的错误TS1005, TS1109,一个交替。

if(object?.foo){} // error TS1109
if(object?.foo){} // error TS1005
if(object?.foo){} // error TS1109
if(object?.foo){} // error TS1005

我在这个项目中使用Angular 7.3.9

它在模板中工作的原因是angular将根据以下表达式对其求值:

<div *ngIf="object && object.foo">

这将防止在对象为null时调用对象属性的错误。

文档链接:https://angular.io/guide/template-syntax#the-安全导航操作员----和空属性路径

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

对于typescript中的变量,?的唯一用途是指定方法的参数是可选的:

function myFunc(mandatoryParam: any, optionalParam?: any) {
...
}
myFunc('hello'); // Will work
myFunc('hello', 'world'); // Will work too

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

Typescript 3.7+具有可选链接(https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-链式(

因此,表达式if (object?.foo) {}是有效语法-如果object未定义或为null,则条件将解析为未定义。

检查你的打字版本。

最新更新