This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
使用 TypeScript
编辑页面
关于为 Expo 项目配置 TypeScript 的深入指南。
Expo 对 TypeScript 提供一流支持。Expo SDK 的 JavaScript 接口是用 TypeScript 编写的。
本指南提供了一种快速开始新项目的方法,也提供了将现有基于 JavaScript 的 Expo 项目迁移为使用 TypeScript 的步骤。
快速开始
要创建新项目,请使用默认模板,其中包含基础 TypeScript 配置、示例代码和基础导航结构:
- npx create-expo-app@latest --template default@sdk-57在使用上述命令创建新项目后,请务必按照以下内容中的说明进行操作:
迁移现有 JavaScript 项目
要将现有基于 JavaScript 的项目迁移为使用 TypeScript,请按照以下说明操作:
1
2
3
使用 tsconfig.json 添加基础配置
项目的 tsconfig.json 默认应继承 expo/tsconfig.base。你可以通过运行以下命令自动生成 tsconfig.json 文件:
- npx expo customize tsconfig.jsontsconfig.json 中的默认配置对用户友好,并鼓励采用。如果你更喜欢 严格类型检查 并减少运行时错误的可能性,可以在 compilerOptions 下启用 strict:
{ "extends": "expo/tsconfig.base", "compilerOptions": { "strict": true } }
4
路径别名(可选)
Expo CLI 会自动支持 tsconfig.json 中的 路径别名。它允许使用自定义别名来导入模块,而不是使用相对路径。
例如,要使用别名 @/components/Button 从 src/components/Button.tsx 导入 Button 组件,请在 tsconfig.json 中添加别名 @/* 并将其设置为 src 目录:
{ "extends": "expo/tsconfig.base", "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] } } }
禁用路径别名
tsconfigPaths 默认启用,这使你可以设置路径别名。你可以在项目的 app 配置 中将 tsconfigPaths 设为 false 来禁用它:
{ "expo": { "experiments": { "tsconfigPaths": false } } }
注意事项
使用路径别名时,请考虑以下内容:
- 修改 tsconfig.json 后,重启 Expo CLI 以更新路径别名。别名变更时无需清除 Metro 缓存。
- 如果不使用 TypeScript,jsconfig.json 可以作为 tsconfig.json 的替代方案。
- 定义路径别名后,会增加额外的解析时间。
- 路径别名仅由 Metro(包括 Metro web)支持,不受已弃用的
@expo/webpack-config支持。 - 现有的 React Native 项目 需要为此功能进行额外设置。更多信息请参阅 Metro 设置指南。
5
绝对导入(可选)
要从项目根目录启用绝对导入,请在 tsconfig.json 文件中定义 compilerOptions.baseUrl:
{ "extends": "expo/tsconfig.base", "compilerOptions": { "baseUrl": "./" } }
例如,设置上述配置后,可以从路径 src/components/Button 导入 Button 组件:
import Button from 'src/components/Button';
注意事项
使用绝对导入时,请考虑以下内容:
- 如果定义了
compilerOptions.paths,它们会相对于compilerOptions.baseUrl进行解析;否则,它们会相对于项目根目录进行解析。 compilerOptions.baseUrl会在 node modules 之前解析。这意味着如果你有一个名为./path.ts的文件,它可能会被导入,而不是名为path的 node 模块。- 修改 tsconfig.json 后,需要重启 Expo CLI 以更新
compilerOptions.baseUrl。 - 如果你不使用 TypeScript,jsconfig.json 可以作为 tsconfig.json 的替代方案。
- 绝对导入仅由 Metro(包括 Metro web)支持,不受
@expo/webpack-config支持。 - 现有的 React Native 项目需要为此功能进行额外设置。更多信息请参阅 版本化 Metro 设置指南。
类型生成
某些 Expo 库同时提供静态类型和类型生成能力。这些类型会在项目构建时自动生成,或者通过运行 npx expo customize tsconfig.json 命令生成。
用于项目配置文件的 TypeScript
要在 metro.config.js 或 app.config.js 等配置文件中使用 TypeScript,需要额外设置。
安装 tsx 作为开发依赖,并利用其 tsx/cjs require hook 在你的 JS 配置文件中导入 TypeScript 文件。这个 hook 允许在保持根文件为 JavaScript 的同时使用 TypeScript 导入。下面的命令会添加 tsx,这样在以下子章节示例中 import 'tsx/cjs' 就能工作。
- npx expo install tsx --dev- npx expo install tsx "--" --devmetro.config.js
更新 metro.config.js,使其引用 metro.config.ts 文件:
require('tsx/cjs'); // 添加这一行以导入 TypeScript 文件 module.exports = require('./metro.config.ts');
使用项目的 Metro 配置更新 metro.config.ts 文件:
import { getDefaultConfig } from 'expo/metro-config'; const config = getDefaultConfig(__dirname); module.exports = config;
已弃用:webpack.config.js
安装 @expo/webpack-config 包。
require('tsx/cjs'); // 添加这一行以导入 TypeScript 文件 module.exports = require('./webpack.config.ts');
import createExpoWebpackConfigAsync from '@expo/webpack-config/webpack'; import { Arguments, Environment } from '@expo/webpack-config/webpack/types'; module.exports = async function (env: Environment, argv: Arguments) { const config = await createExpoWebpackConfigAsync(env, argv); // 在返回之前自定义配置。 return config; };
app.config.js
默认支持 app.config.ts。但是,它不支持外部 TypeScript 模块,也不支持 tsconfig.json 自定义。你可以使用以下方法获得更完整的 TypeScript 配置:
import 'tsx/cjs'; // 添加这一行以导入 TypeScript 文件 import { ExpoConfig } from 'expo/config'; const config: ExpoConfig = { name: 'my-app', slug: 'my-app', }; export default config;
其他 TypeScript 功能
某些语言特性可能需要额外配置。例如,如果你想使用装饰器,就需要添加 experimentalDecorators 选项。有关可用属性的更多信息,请参阅 TypeScript 编译器选项 文档。
了解如何使用 TypeScript
学习 TypeScript 的一个好起点是官方的 TypeScript Handbook。
对于 TypeScript 和 React 组件, 我们建议参考 React TypeScript CheatSheet,以了解如何在各种常见场景下为你的 React 组件添加类型。