映射类型 remove 修饰符 -readonly 与 -? 的组合效果
写表单状态、配置对象、API 返回数据这些类型时,几乎每个人都遇到过同一类麻烦:上游类型把字段标成了 readonly,下游需要可写副本;上游把字段标成可选 ?,下游需要一份字段齐全的完整对象。手写一个新 interface 能解决,但字段一多就会和上游脱节——上游加字段,下游忘了同步,编译不报错,运行时才炸。TypeScript 的映射类型(mapped
写表单状态、配置对象、API 返回数据这些类型时,几乎每个人都遇到过同一类麻烦:上游类型把字段标成了 readonly,下游需要可写副本;上游把字段标成可选 ?,下游需要一份字段齐全的完整对象。手写一个新 interface 能解决,但字段一多就会和上游脱节——上游加字段,下游忘了同步,编译不报错,运行时才炸。TypeScript 的映射类型(mapped
面试里问 Promise,最常见的翻车点不是 new Promise 怎么写,而是被问到「上一个 then 里 return 了个东西 / throw 了个错,下一个 then 到底走 onFulfilled 还是 onRejected」时开始含糊。这个问题之所以容易答错,是因为它同时牵扯三件事:then 的返回值如何被 Promise.resolve 包装
很多团队改 /etc/ssh/sshd_config 的方式还是「登上去 vim 一下,然后 systemctl reload sshd」。这种做法的风险不在于改错一两行,而在于改完之后没人知道这台机器上到底改过什么:三年前有人把 PermitRootLogin 改成 yes,两年半前另一个人把 PasswordAuthentication 复制了两行、一行
购物车是电商系统里最容易出现并发写冲突的数据结构之一:同一个用户可能在 App、小程序、Web 三端同时操作,也可能因为网络重试导致同一个「加购 +1」请求被提交两次。如果直接对 Redis Hash 里的 quantity 字段做 HINCRBY,数字本身不会写坏,但业务规则会被绕过——比如「单 SKU 最多 99 件」的限购、「购物车最多 50 个 SK
写业务代码时经常遇到这种场景:一个 List 里装着一批订单或用户对象,要先按主字段排序,主字段相等再按次字段排序,而某些字段本身允许为 null。直接写 Comparator.comparing(Order::getAmount).thenComparing(Order::getCreateTime),一旦遇到 null 字段就会在读数据时抛 NullPo
线上一条订单落库接口偶发 Lock wait timeout exceeded; try restarting transaction,日志里死锁检测输出 insert intention lock 与 gap lock 互相等待。开发同学第一反应是"我插的是新数据,没人锁它"。这正是间隙锁最常见的认知盲区:间隙锁锁的是范围,而 INSERT 需要的插入意向
写 Go 并发的时候,最常踩的坑不是「不会起 goroutine」,而是「起了收不回来」。典型场景:一批 RPC 要并发发起,只要有一个失败就立刻停掉其余请求并返回第一个错误;或者一批 worker 在跑,用户在终端按下 Ctrl+C,需要让所有 worker 收到信号、优雅收尾。手写 sync.WaitGroup + context.WithCancel
itertools.groupby 是 Python 标准库里最容易被误用的函数之一。它的签名看起来像 SQL 的 GROUP BY,但语义完全不同:它只合并相邻的相同键,不做全局汇总。于是「忘了先排序」成了高频事故——数据没报错、结果却悄悄少了行或者多了组。这篇教程把 groupby 的真实语义、四种常见翻车现场、排序键的挑选技巧,以及 sort + gr
日常运维里最容易出事的不是磁盘满,而是同一个备份脚本被 crontab 和手动执行同时拉起来两份。两份 rsync 抢同一个目标目录,两份 mysqldump 同时往同一个 .sql 里写,两份日志清理脚本同时 find -delete,结果往往是文件损坏、任务卡死、负载飙高,而排查时又抓不到现场。本文给出一个不依赖 flock 之外的额外软件、只用 She