Har*_*til 24

当TypeScript认为某个属性变量是null或时,会出现这种情况undefined.但是,如果您确定此变量不能为null,则可以使用此运算符.

考虑这个例子:

let a = document.getElementById('hello');

if (a) {
    a.style.width = '100px';
}
Run Code Online (Sandbox Code Playgroud)

TypeScript假定该变量a可能为null,因为无法保证此元素存在.因此,在您访问该变量之前,您已经if提防了.但是如果你知道你的应用程序总是有一个带id的HTML元素#hello,那么你可以将上面的代码重写为:

const a = document.getElementById('hello');

a!.style.width = '100px';
Run Code Online (Sandbox Code Playgroud)

上面的代码更易读,更简洁.欲了解更多信息,访问:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html

  • 比这更具体。重要的是要准确地了解它的作用,否则它有一天会回来咬你-““特别是,x!操作会产生x类型的值,其中排除了null和undefined。” 您的答案还暗示着这两个代码块是等效的。您拥有的第一段代码更安全-第二段实际上可能有错误。但是,这完全取决于编译器的警告-那是唯一的事情!确实-是Typescript已知的“调整类型”。**使用绝不会影响运行时代码!** (10认同)
  • 否决,因为答案没有解释问题中的代码示例如何影响类型检查,并且该示例虽然相关,但没有直接解决所提出的问题,只会让读者感到困惑。请看下面iislucas的回答 (4认同)

iis*_*cas 5

这是一个“明确分配断言”:varname !: sometype通知打字稿不要担心是否varname可能未分配(它告诉打字稿varname肯定会被分配,即使打字稿无法推断出分配在哪里)。通常,打字稿会检查该变量是否未分配,并给出错误。

有关更多信息,请参见:https : //www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#definite-assignment-assertions

  • 这是正确的答案,因为问题不是关于“非空断言运算符”。正如链接文档中所述:“从某种意义上说,明确赋值断言运算符是非空断言运算符的对偶(其中表达式后缀为!),我们也可以在示例中使用它。 ” (3认同)