对 TypeScript 的一流支持
随着 0.71 版本的发布,React Native 正在通过以下更改投资 TypeScript 体验
在本文中,我们将介绍这些更改对作为 TypeScript 或 Flow 用户的您意味着什么。
新的应用模板默认使用 TypeScript
从 0.71 版本开始,当您通过 React Native CLI 创建新的 React Native 应用时,您将默认获得一个 TypeScript 应用!
npx react-native init My71App --version 0.71.0
新生成的应用的起点将是 App.tsx 而不是 App.js – 完全使用 TypeScript 类型。新项目已经设置了 tsconfig.json,因此您的 IDE 将立即帮助您编写类型化代码!
TypeScript 声明随 React Native 一起发布
0.71 是第一个包含内置 TypeScript (TS) 声明的版本。
之前,React Native 的 TypeScript 声明由托管在 DefinitelyTyped 存储库中的 @types/react-native
提供。将 TypeScript 类型与 React Native 源代码共同定位的决定是为了提高正确性和可维护性。
@types/react-native
仅为稳定版本提供类型。这意味着,如果您想在 TypeScript 中使用 React Native 的预发布版本进行开发,则必须使用旧版本的类型,这可能不准确。发布 @types/react-native
也容易出错。发布滞后于 React Native 发布,并且该过程涉及手动检查对 React Native 公共 API 所做的类型更改,并更新 TS 声明以匹配。
随着 TS 类型与 React Native 源代码共同定位,TS 类型的可见性和所有权更高。我们的团队正在积极开发工具,以保持 Flow 和 TS 之间的一致性。
此更改还消除了 React Native 用户需要管理的依赖项。升级到 0.71 或更高版本时,您可以删除 @types/react-native
作为依赖项。 请参阅新应用模板,了解如何设置 TypeScript 支持。
我们计划在 0.73 及更高版本中弃用 @types/react-native
。具体来说,这意味着
- 将发布
@types/react-native
,用于跟踪 React Native 0.71 和 0.72 版本。它们将与 React Native 相关发布分支中的类型相同。 - 对于 React Native 0.73 及更高版本,TS 类型将仅从 React Native 提供。
如何迁移
请尽快迁移到新的共同定位类型。以下是根据您的需求迁移的更多详细信息。
应用维护者
升级到 React Native >= 0.71 后,您可以从您的 devDependency
中删除 @types/react-native
。
如果您收到警告,因为您使用的库将 @types/react-native
引用为 peerDependency
,请提交问题或为该库打开 PR 以使用可选的 peerDependencies,并暂时忽略该警告。
库维护者
目标版本低于 0.71 的 React Native 库可以使用 @types/react-native
的 peerDependency
来针对应用的类型版本进行类型检查。此依赖项应在 peerDependenciesMeta
中标记为可选,以便没有 TypeScript 的用户或类型内置的 0.71 用户不需要类型。
依赖于 @types/react-native
的 TypeScript 声明的维护者
查看 0.71 版本引入的重大更改,以查看您是否已准备好迁移。
如果我使用 Flow 怎么办?
Flow 用户可以继续类型检查以 0.71+ 为目标的应用,但其配置逻辑不再包含在模板的开箱即用配置中。
Flow 用户以前通过从新应用模板合并 .flowconfig
并手动更新 flow-bin
来升级 React Native 的 Flow 类型。新的应用模板不再有 .flowconfig
,但 React Native 存储库中仍然存在一个,可以用作您应用的基础。
如果您需要在 Flow 中启动新的 React Native 应用,您可以参考 0.70 版本的新应用模板。
如果我在 TypeScript 声明中发现错误怎么办?
无论您是使用内置的 TS 类型还是 @types/react-native
,如果您发现错误,请向 React Native 和 DefinitelyTyped 存储库提交 PR。如果您不知道如何修复它,请在 React Native 存储库中提交 GitHub 问题,并在问题中提及 @lunaleaps。
文档优先考虑 TypeScript
为了确保一致的 TypeScript 体验,我们对 React Native 文档进行了一些更新,以反映 TypeScript 作为新的默认语言。
代码示例现在允许内联 TypeScript,并且超过 170 个交互式代码示例已更新,以通过新模板中的 linting、格式化和类型检查。大多数示例都同时适用于 TypeScript 和 JavaScript。在不兼容的情况下,您可以查看任一语言的示例。
如果您发现错误或有改进之处,请记住该网站也是开源的,我们很乐意看到您的 PR!
感谢 React Native TypeScript 社区!
最后,我们要感谢多年来社区为确保 React Native 开发人员可以使用 TypeScript 所做的所有工作。
我们要感谢自 2015 年以来一直维护 @types/react-native
的所有 贡献者!我们看到了大家为确保 React Native 用户获得最佳体验所付出的努力和关怀。
感谢 @acoates、@eps1lon、@kelset、@tido64、@Titozzz 和 @ZihanChen-MSFT 在咨询、提问、沟通和审查将 TypeScript 类型移动到 React Native 的更改方面提供的帮助。
同样,我们要感谢 react-native-template-typescript
的 维护者,感谢他们从第一天起就支持 React Native 中新应用开发的 TypeScript 体验。
我们期待在 React Native 存储库中更直接地合作,并继续改善 React Native 开发人员的体验!