用途:帮助开发者理解并适应 TypeScript 的结构化类型系统,避免因类型“意外通过”而产生误判,同时利用其特性设计更灵活的接口和测试。适用于对 TypeScript 接受“错误”值感到意外、设计接口与函数参数、编写 mock 对象做单元测试、排查看似不可能的报错、以及疑惑为何允许额外属性等场景。
主要能力:核心原则是“只要有需要的属性、类型兼容,就可赋值”;额外属性不会使值非法;类按结构而非身份比较。数值类型示例中 Vector2D 只要含 x、y 即可,带额外 name 或 z 的变量也能传入。函数参数同理,Vector3D 可赋给 Vector2D 参数,可能忽略 z 导致逻辑 bug。测试时无需 mock 库,只要构造形状相同的方法对象即可通过类型检查。
使用方式:对象字面量是例外,直接赋值时多余属性会被标记为错误;经中间变量则允许。若需更严格约束,可用可选 never(如 z?: never)禁止某属性,或用 branded types 加唯一标记。类可通过私有字段防止结构化伪造绕过构造器校验。
限制:文档强调切勿假设类型是“封闭”的,额外属性总会被允许;类型不应期待类身份生效;校验收敛在构造函数中的逻辑会被结构对象绕过。文中引用自《Effective TypeScript》第 4 条,未提供平台、收费、价格、安装命令或其它步骤信息。