TypeScript 类型守卫:typeof、instanceof 与自定义谓词的选择场景
在 TypeScript 项目里,把 unknown 或 any 收窄成具体类型是每天都要做的事。最常见的翻车现场是:接口返回的 JSON 被断言成 User,运行时字段缺失,页面白屏,控制台只留下一句 Cannot read properties of undefined (reading 'name')。类型守卫(type guard)就是解决这个问题的
在 TypeScript 项目里,把 unknown 或 any 收窄成具体类型是每天都要做的事。最常见的翻车现场是:接口返回的 JSON 被断言成 User,运行时字段缺失,页面白屏,控制台只留下一句 Cannot read properties of undefined (reading 'name')。类型守卫(type guard)就是解决这个问题的
很多人写 with 语句时只关心「打开、关闭」这一层,能跑通就不深究。可一旦业务里出现异常被悄悄吞掉、__exit__ 里抛出新的异常覆盖了原始异常、或者 GeneratorExit 让 @contextmanager 报出 RuntimeError: generator didn't stop after throw(),就会调上一两个小时。这篇文章把 w
crontab 用了二十年,但它有几个真问题:失败无感知、依赖无法表达、错过执行不补跑、日志散落。systemd timer 把这些都解决了。 crontab 的四个痛点 失败了没人知道 —— 除非自己重定向邮件,而邮件服务往往没配 无法表
systemd 能管大多数服务,但总有例外:容器里跑的业务进程、第三方不给 unit 文件的程序、需要按业务逻辑判断存活的场景。这时候一个轻量守护脚本比强行套 systemd 更实际。 探活:端口 vs 进程 只看进程活着不够——进程在但服
服务器磁盘被打满的原因,九成是日志没人管。写一个能定时跑、超阈值会叫人的脚本,比事后救火体面得多。 需求拆解 按时间清理 N 天前的日志 磁盘使用率超过阈值时告警 找到并处理异常大的单个文件 全程记日志,方便事后追溯 脚本 #!/bin/b
标准答案是"防止历史重复连接初始化"。但这题真正的分量在于你能不能用序列号把整个过程讲清楚。 核心:确认双方的双向收发能力 三次握手交换的是 ISN(Initial Sequence Number,初始序列号): 客户端 服务端 |----
这题考察的是对存储介质的理解,而不只是背结论。要点在于:数据库的数据最终要落盘,而磁盘随机 IO 比内存慢 5 个数量级。 先看三个候选的问题 哈希索引:等值查询 O(1),很快。但 不支持范围查询(WHERE age > 20 没法
这题几乎是 Go 面试的开场题,但很多人只答出"一个初始化一个不初始化",没说到点子上。核心差异在于返回的类型和适用场景。 标准答案 | | new(T) | make(T, ...) | |---|---|---| | 返回类型 | *T
排行榜、Top N、分组取最新一条——这类需求用窗口函数写起来最舒服。但老代码里常见的是自连接或子查询写法,数据量一上来就慢到不可用。 一个典型场景 每门课程要取分数最高的前 3 名学生。自连接写法: SELECT s.* FROM sco