const NoneSymbol = Symbol("none"); const isNone = (val: unknown): val is null | undefined => { return (val ?? NoneSymbol) === NoneSymbol; };
我补充一下我上面 #16 的回复,这种要不就别封装,要不就直接用 lodash 这种大家都熟悉的库,至少文档清晰,有 bug 一般也不会怀疑它的内部实现。 下图我节选一个我项目中遇到的情况,封装了一百多个 utils function ,每个都不复杂,实现也很精巧,这些 utils 是一位很有经验的高级程序员写出来的。 但是,每次我阅读业务代码时看到 isNil / isEmpty / isTrue 这种,都会想里面是不是有什么魔法,会浪费很多时间点进去看细节。而且对 AI coding 也很不友好,要到处读文件去看实现,不像 lodash 或者直接 inline 有 well-defined behavior 。
只有一个最佳实践,额外封装一个 isEmpty 给自己用,把需要判空的 case 加入判断,即便项目内已经存在了其他同事封装的相同方法,安装了 lodash 。 不要考虑其他同事的阅读性,因为事实就是没有人有动力去用不熟悉的代码的封装,除非必须或有大手推动。