Postfix补全需手动启用且按语言独立配置,仅对合法可求值表达式在光标紧贴末尾时生效;ifnull与notnull语义相反,自定义模板须精准设置Expression type并点击Apply。

Postfix补全在 WebStorm 里默认不开,得手动开
WebStorm 安装完默认不启用 Postfix Completion,哪怕你写了 a != null 按 . 也不会弹出 ?.let 或 ?.also 这类补全。它藏在设置深处,而且不同语言(Java / Kotlin / JavaScript)的开关是分开管的。
实操建议:
- 进 Settings → Editor → General → Postfix Completion,勾上 Enable postfix completion
- 点右上角 Language-specific settings,确认你要用的语言(比如
Kotlin)已启用,且常用模板如notnull、safeCall、ifnull处于勾选状态 - Java 用户注意:
?.类补全只在 Java 14+ 的预览特性开启时部分生效;日常更推荐用ifnull或notnull模板
写 list?.size 后按 . 没反应?检查光标位置和表达式合法性
Postfix 补全不是“写了啥就补啥”,它只对**合法、可求值的表达式**生效,且光标必须紧贴表达式末尾(不能有空格、换行或分号)。
常见错误现象:
-
list?.size .(中间有空格)→ 不触发 -
list?.size;(后面跟了分号)→ 不触发 -
list?.get(0)→ 如果get返回Any?但没声明具体类型,Kotlin 推导失败,?.let模板可能灰掉 - Java 中写
str.length()后按.,但str是String非空类型 →notnull模板不出现(因为 IDE 认为没必要)
ifnull 和 notnull 模板行为差异大,别混用场景
这两个最常用,但语义完全不同:ifnull 是「为空时走分支」,notnull 是「非空时才执行」。用错会导致逻辑翻转或空指针照常抛。
使用场景与参数差异:
-
foo.ifnull展开为if (foo == null) { } else { },光标停在if分支内;适合做兜底处理 -
foo.notnull展开为if (foo != null) { },且自动把foo转成非空局部变量(Kotlin 中是 smart cast,Java 中加@NotNull断言) - Kotlin 下
foo?.let实际等价于foo.notnull+ 闭包,但更函数式;而foo?.also更适合带副作用的非空操作 - JavaScript 中没有类型系统,
ifnull会生成if (foo == null),注意是双等号,不是严格相等
自定义 Postfix 模板容易失效,关键在表达式上下文匹配
自己加的模板(比如想输入 log 后按 . 打出 Log.d("TAG", "$it"))经常不弹,不是配置错了,而是匹配规则太松或太紧。
实操要点:
- 模板的 Expression type 必须写准:比如想对任意字符串生效,填
java.lang.String;想对所有对象生效,填java.lang.Object(Java)或kotlin.Any(Kotlin) - 不要用通配符或正则——WebStorm 的 Postfix 不支持,只认确切类名或继承链顶层
- 新增模板后,必须点 Apply(不是 OK),否则重启也不生效
- 调试技巧:写一个确定能匹配的变量(如
val s: String = ""),输入s.,看模板是否亮起;不亮就说明Expression type写错了
Postfix 补全真正难的不是开开关,而是理解它依赖 IDE 对表达式的实时类型推导——一旦类型模糊(比如泛型擦除、平台类型、未初始化 var),模板就静默失效。与其反复试,不如先用 Ctrl + Shift + Space 唤出智能类型感知补全,确认表达式类型是否被正确识别。

















