配了三年 React Native,每次 TypeScript 报错你以为是代码写错了——今天才发现根子不在代码里,在那些手写的 .d.ts 文件早就和源码脱节了
配了三年 React Native,每次 TypeScript 报错你以为是代码写错了——今天才发现根子不在代码里,在那些手写的 .d.ts 文件早就和源码脱节了。0.87 把这件事彻底变了。
这个问题困扰了你多久
React Native 的 TypeScript 类型,长期靠人工维护。团队里有人改了一行代码,类型文件没人顺手更新,然后你升了版本,IDE 报一堆错,你以为是自己写的有问题,排查半天发现是类型文件过期了。
这不是你的问题。这是 RN 历史上一直存在的结构性缺陷:类型定义和源码是两条线,没人保证它们同步。
8 月 11 日发布的 React Native 0.87,把这个问题从根上修了。
Strict TypeScript API 是什么
0.87 把 Strict TypeScript API 从预览变成了默认。核心变化就一件事:类型定义现在直接从源码生成,不再人工维护。
之前:类型文件是手工写的,和实际代码 drift(漂移)是常态。
现在:CI 直接从 TypeScript 源码跑 codegen,类型和代码永远对得上。
这带来的具体改变:
类型可信了。 悬停 TextInput,之前只显示 class TextInput。现在会显示完整类型定义,包含 State、currentlyFocusedInput、focusTextInput 等所有属性和方法。文档注释也补上了。
API 稳定了。 之前 RN 内部重构改个文件名,你的项目就报类型错误,因为深层导入路径变了。现在公共 API 只从 react-native 根导出,深层路径(react-native/Libraries/*)不再算公共 API,你不用再为 RN 内部的目录调整背锅。
迁移有工具。 官方给了 /migrate-to-strict-api skill,可以自动迁移大部分场景。
这些 breaking changes 你需要知道
0.87 的 Strict TypeScript API 是有 breaking changes 的,只是大多数项目不会踩到:
深层导入全部报错。 react-native/Libraries/* 路径现在是类型错误,必须迁移到根导入。比如之前这样写的:
import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent";
import type { Int32, WithDefault } from "react-native/Libraries/Types/CodegenTypes";
现在要改成:
import { CodegenTypes, codegenNativeComponent } from "react-native";
LinkingStatic 被删了。 之前 Linking 和 LinkingStatic 是两个东西,现在统一成 Linking。
Refs 类型变了。 ViewInstance、TextInputInstance 这些专用类型替代了之前的泛型 RefObject。
如果你暂时不想迁移,0.87 提供了 opt-out 开关:
// tsconfig.json
{
"compilerOptions": {
"customConditions": ["react-native-strict-api"]
}
}
但这个开关 0.88 会失效,0.89 彻底移除,拖不得。
Metro 0.87 也在变轻
除了类型系统,0.87 的 Metro 打包器本身也有改善:
- 源映射生成快 2 倍:DevTools 加载时间直接缩短
- 内存占用减半:大项目打包不再吃满内存
- 支持 TypeScript 和 ESM 配置文件:
.mts文件直接用
另外,实验性的 Swift Package Manager 支持也进了一步。之前 iOS 依赖要装 CocoaPods,需要 Ruby、Bundler、一堆环境配置。现在只需要 Xcode,一条命令切换:
npx react-native spm --deintegrate
怎么判断要不要立刻升级
升的理由:
- 类型系统从不可信变可信,开发体验提升明显
- Metro 性能翻倍,大项目每次 rebuild 能省不少时间
- 0.89 强制迁移,迟早要动,不如早动
等等的理由:
- 项目依赖了大量第三方库,还没确认兼容 0.87
- 生产环境求稳,等 patch 版本
- 团队没有人力做迁移验证
如果你现在跑的是 0.80+,建议尽快在测试环境跑一遍 npx react-native upgrade,看有多少 breaking change。265 commits,74 contributors,0.87 是 RN 历史上少有的大版本,类型系统修正是迟来但正确的一步。
下一步你可以做的一件事:
把测试环境的 RN 版本升到 0.87,跑一遍 npx tsc --noEmit,看看报出来的类型错误有多少是深层导入迁移,有多少是真的代码问题。前者用官方 skill 修,后者才是你真正要修的 bug。
评论区
登录后可评论。