`undefined!` 在打字稿中是啥意思?

Posted

技术标签:

【中文标题】`undefined!` 在打字稿中是啥意思?【英文标题】:What does `undefined!` means in typescript?`undefined!` 在打字稿中是什么意思? 【发布时间】:2021-04-21 17:33:23 【问题描述】:

打字稿源代码在很多地方使用undefined!。比如binder.ts,第261行到第271行:

            file = undefined!;
            options = undefined!;
            languageVersion = undefined!;
            parent = undefined!;
            container = undefined!;
            thisParentContainer = undefined!;
            blockScopeContainer = undefined!;
            lastContainer = undefined!;
            delayedTypeAliases = undefined!;
            seenThisKeyword = false;
            currentFlow = undefined!;

从打字稿官方文档中,后缀! 表示“非空断言运算符”,其定义是:

一个新的!后缀表达式运算符可用于在类型检查器无法断定该事实的上下文中断言其操作数为非空且非未定义

所以undefined! 这种用法似乎没有意义,因为它断言 undefined 是非未定义的。

undefined!是什么意思,我们为什么要这样使用?

【问题讨论】:

可能“这在运行时永远不会为空”... @user202729 听起来很合理,但我从来不知道这种用法,希望更多细节或文档 可能相关的答案在这里 - ***.com/questions/38874928/… 【参考方案1】:

所以这个用法未定义!似乎没有意义,因为它断言未定义是未定义的。

undefined! 是什么意思,为什么要这样使用?

另一种说法是,告诉打字稿“闭嘴,我知道我在做什么”。如果 strictNullChecks 开启,Typescript 将在将 undefined/null 分配给类型不包含 undefined/null 的值时报错。

strictNullChecks 是一个很好的默认值,但在某些情况下,您可能希望分配 undefinednull(可能在本地范围内或库的私有部分),并且您自己保证“总是会确保在稍后设置一个值。

这样做的好处是库的用户不必处理可选属性,而且作为库作者,您可能对如何在对象离开库边界之前构建对象有更多的灵活性。

例子:

type MyArticle = 
  title: string;


function getArticle(): MyArticle 

  const result:MyArticle = 
    // ignore the undefined error, we're dealing with this later.
    title: undefined!,
  ;

  result.title = 'Hello world';
  return result;


上面的例子是人为的。有更好的方法来构建它,我怀疑您共享的示例也是如此。

【讨论】:

以上是关于`undefined!` 在打字稿中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

打字稿中的剂量[索引:字符串]是啥意思[重复]

打字稿中的模块关键字是啥意思?

如何在打字稿中避免这种符号“| undefined”?

打字稿中变量之间的区别

如何理解打字稿中的“属性'名称'在'用户'类型中是私有的”

`undefined` 的类型签名在 Haskell 中是啥意思?