-
我在 TypeScript 里给函数参数标了个空对象大括号类型、想表示只收一个对象,结果传数字、传字符串、传布尔值进去编译器全都不报错照单全收,我盯着那对空大括号愣了半天,最后才搞懂这个看着像空对象的类型实际表示的是除了 null 和 undefined 之外几乎任何值的深度复盘
我写了个函数本意只接收一个对象(任意结构都行但至少得是对象、不能是基本类型),很自然把参数类型标成了 {}——直觉里 {} 不就是一个空对象引申为任意对象嘛,以为这样就能限制住只准传对象。可写着发现不对:把 42、hello、true 这些明显不是对象的值传进去编译器一个错都不报,这道我以为加上的只准传对象的约束形同虚设。我以为哪里写错了、反复确认参数类型就是 {},又怀疑 strict 没开也开…- 0
- 0
-
我把 productId 当成 userId 传进了查询函数,两个都是 number、TypeScript 一声没吭,直到线上查出了张冠李戴的数据:一次 TS 结构化类型让语义不同的 ID 意外兼容、用品牌类型才拦住的深度复盘
我们有 getUser(userId: number) 和 getProduct(productId: number) 两个函数,一次重构里我手滑把 productId 传给了 getUser,满以为 TypeScript 会拦下这种低级错误,可它一声没吭、编译通过。线上就出现了用商品 ID 查用户、查出张冠李戴数据的诡异现象。查到底才明白这不是 bug:TS 是结构化类型系统,判断两个类型是否兼…- 0
- 0
-
我把一个商品 ID 错传给了需要用户 ID 的函数,TypeScript 全程绿灯没有半点警告,直到线上查错了数据才暴露,我对着结构化类型让语义不同的类型随意互换这个坑排查大半天的复盘
一个让我对 TypeScript 类型系统到底在保护什么重新认识的坑,隐蔽在我犯的是纯粹的逻辑错误(把 A 的 ID 当 B 的 ID 用),而我以为有类型系统罩着的 TS 却完全沉默。代码里有用户 ID 和商品 ID 恰好都是 number。type UserId = number;type ProductId = number;有个 getUserById(id: UserId) 函数,重构时…- 0
- 0
-
我给两个含义完全不同的 ID 都用了 string 类型,结果把商品 ID 当成用户 ID 传了进去,TypeScript 却一声没吭,我排查了大半天才搞懂结构化类型的深度复盘
我的用户 ID 和商品 ID 含义完全不同,但底层都用 string。某次手滑把商品 ID 传给了要用户 ID 的 getUser 函数,本以为号称类型安全的 TS 会拦下,结果它一声没吭、放行了,bug 一路跑到深处才因查不到用户而爆。深究才懂:TS 用的是结构化类型(看结构),不是 Java/C# 的名义类型(看名字)——userId 和 productId 结构都是 string、结构一样就…- 0
- 0
-
我把订单 ID 当成用户 ID 传进了查用户的函数,TypeScript 却一声不吭:结构化类型系统给我上的那一课的踩坑复盘
我给 UserId 和 OrderId 定义了不同的类型,以为 TS 会守住"别把订单 ID 当用户 ID 用"这条线。可手滑把订单 ID 传进查用户的函数,TS 却一声不吭、编译通过,运行时拿订单 ID 去用户表查了个寂寞。根因是 TypeScript 用的是结构化类型——按"结构"而非"名字"判断兼容,而两个 ID 结构都是 {val…- 0
- 0
结构化类型
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!





