news 2026/6/15 17:09:40

RN + TypeScript 项目越写越乱?如何规范架构?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RN + TypeScript 项目越写越乱?如何规范架构?

@[toc]

如果你在 RN 项目里用了 TypeScript,但还是经常遇到下面这些情况,那你大概率不是一个人:

  • 业务一多,代码开始到处飞,找逻辑像在翻垃圾堆
  • hooks 套 hooks,useEffect 里再调 useEffect,自己都不敢改
  • 类型文件一堆,但和真实实现经常对不上
  • 新人一来就问:“这个状态到底在哪儿改的?”

这篇文章不是教你“TypeScript 怎么写”,而是教你:
在 RN 项目里,TypeScript 怎么和架构一起用,才能不失控。

一、为什么 RN + TS 项目特别容易“写乱”?

先说一个结论:

项目乱,不是因为 TypeScript,而是“职责边界不清 + 状态乱流”。

1. 业务增长,逻辑开始横向扩散

最常见的场景:

  • 页面里写请求
  • hook 里也写请求
  • redux 里再写一套
  • utils 里还有一份“备用逻辑”

结果是:
一个需求改 4 个地方,还不一定改全。

2. Hooks 层级复杂,本来是解耦,最后变成“黑盒”

你可能写过类似这样的代码:

functionusePageLogic(){constdata=useFetch()constresult=useProcess(data)useEffect(()=>{doSomething(result)},[result])}

问题不是 hooks 多,而是:

  • hooks 里混了业务规则
  • hooks 之间有隐式依赖
  • 调试时根本不知道是哪一层出问题

3. 类型与实现分离,最后谁都不信类型

常见症状:

  • interface 写得很全
  • 实际接口返回偷偷多字段 / 少字段
  • any 越用越多
  • 最后 TS 只剩“自动补全工具”的作用

二、一个能长期维护的 RN + TS 项目结构

先给你一个推荐结构总览,这是我在中大型 RN 项目里反复验证过的。

src/ ├── domain/ // 业务模型 & 业务规则 ├── service/ // API / SDK / 数据来源 ├── hooks/ // 可复用 hooks ├── store/ // 全局状态 ├── ui/ // 纯 UI 组件 ├── pages/ // 页面(只组装,不写重逻辑) ├── utils/ └── types/

接下来我们逐层拆。

三、domain 层:业务规则的“唯一入口”

domain 是整个项目的核心。

你应该在 domain 里放什么?

  • 业务实体(User、Order)
  • 业务规则(状态转换、校验)
  • 与 UI、网络无关的逻辑

示例:用户领域模型

// domain/user.tsexportinterfaceUser{id:stringname:stringrole:'admin'|'user'}exportfunctionisAdmin(user:User){returnuser.role==='admin'}

关键点:

  • domain 不 import RN、API、store
  • domain 只关心“业务正确性”

四、service 层:所有“数据来源”的统一出口

service 只做一件事:

把外部世界的数据,变成 domain 能用的数据。

示例:请求用户接口

// service/userService.tsimport{User}from'@/domain/user'exportasyncfunctionfetchUser():Promise<User>{constres=awaitfetch('/user')returnres.json()}

不要在页面里直接 fetch。

五、hooks 层:封装“状态 + 行为”,但不写业务规则

一个非常重要的原则:

hooks = orchestration,不是 business logic。

示例:useUser

// hooks/useUser.tsimport{useEffect,useState}from'react'import{fetchUser}from'@/service/userService'import{User}from'@/domain/user'exportfunctionuseUser(){const[user,setUser]=useState<User|null>(null)useEffect(()=>{fetchUser().then(setUser)},[])returnuser}

如果你发现 hook 里开始写if (role === 'admin')
那说明:逻辑该下沉到 domain 了。

六、UI 层:彻底“无脑”的组件

UI 组件只负责:

  • 接 props
  • 渲染
  • 触发回调

示例:用户卡片

type Props = { name: string onPress: () => void } export function UserCard({ name, onPress }: Props) { return ( <Pressable onPress={onPress}> <Text>{name}</Text> </Pressable> ) }

UI 层不 import hooks、不 import service。

七、页面(Page):只做“组装”

页面是“最脏但最轻”的一层。

export function UserPage() { const user = useUser() if (!user) return null return ( <UserCard name={user.name} onPress={() => {}} /> ) }

页面:

  • 可以用 hook
  • 可以用 store
  • 但不写核心逻辑

八、全局状态方案怎么选?

这是 RN 项目里非常容易踩坑的一点。

Redux Toolkit

适合:

  • 状态多
  • 多页面共享
  • 对可预测性要求高

优点:

  • 规范
  • DevTools 强

缺点:

  • 样板代码略多

Zustand

适合:

  • 中小项目
  • 状态简单
  • 希望写得快
constuseStore=create(set=>({count:0,inc:()=>set(state=>({count:state.count+1}))}))

Recoil

适合:

  • 状态依赖复杂
  • 类似图结构

但心里要有数:生态和长期维护要评估。

九、TypeScript 在 RN 项目的最佳实践

1. 类型从 domain 开始

不要一上来就写:

typeProps=any

类型应该从业务模型流出。

2. 禁止“到处定义重复类型”

统一出口:

exporttype{User}from'@/domain/user'

3. 不要为了 TS 而 TS

有些地方允许不完美:

constref=useRef<any>(null)

关键在于:核心业务链路一定要有类型。

十、常见反模式(请尽量避免)

1. 滥用 useEffect 做状态管理

useEffect(()=>{setA(calcB(b))},[b])

这种写多了,状态会完全失控。

2. 一个 hook 管一切

usePageLogic()

内部 500 行代码,没人敢碰。

3. domain 被 UI 污染

import{Alert}from'react-native'

一旦 domain import RN,架构就开始塌。

十一、真实项目里的收益

在真实 RN 项目中,用这套结构后:

  • 新需求平均开发时间 ↓ 30%+
  • Bug 定位明显更快
  • 新人 1~2 天能独立改需求
  • TS 不再是“摆设”

最后的总结

如果你只记住一句话:

RN + TypeScript 的核心不是“写类型”,而是“让结构帮你兜住复杂度”。

TypeScript 是放大器:

  • 架构好 → TS 越用越爽
  • 架构乱 → TS 只会更痛苦
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 14:39:58

常见的软件测试面试题汇总

常见的面试题汇总 1、你做了几年的测试、自动化测试&#xff0c;说一下 selenium 的原理是什么&#xff1f; 我做了五年的测试&#xff0c;1年的自动化测试&#xff1b; selenium 它是用 http 协议来连接 webdriver &#xff0c;客户端可以使用 Java 或者 Python 各种编程语言…

作者头像 李华
网站建设 2026/6/15 10:31:17

智能Agent Docker日志收集全解析(专家级配置方案曝光)

第一章&#xff1a;智能Agent日志收集架构概览在现代分布式系统中&#xff0c;智能Agent日志收集架构承担着关键的数据采集与传输职责。该架构通过轻量级代理程序部署于各个节点&#xff0c;实时捕获应用运行时日志、系统指标及事件流&#xff0c;并将数据高效汇聚至集中式分析…

作者头像 李华
网站建设 2026/6/13 22:56:24

临床数据清洗生死战:R语言缺失值识别与处理关键技术大公开

第一章&#xff1a;临床数据清洗生死战&#xff1a;R语言缺失值处理的挑战与意义在临床研究中&#xff0c;数据质量直接决定分析结果的可信度与医学决策的准确性。原始电子病历、实验室报告和随访记录常包含大量缺失值&#xff0c;这些“数据黑洞”若不加处理&#xff0c;将导致…

作者头像 李华
网站建设 2026/6/15 11:19:56

Dify文档生成技巧大公开,Agent工具开发者都在偷偷用

第一章&#xff1a;Dify文档生成的核心价值与Agent应用场景Dify 作为一款面向 AI 应用开发的低代码平台&#xff0c;其文档生成功能不仅提升了技术协作效率&#xff0c;更通过 Agent 机制实现了动态内容生成与智能交互。借助 Dify 的可视化编排能力&#xff0c;开发者可将大语言…

作者头像 李华
网站建设 2026/6/15 1:12:46

司马阅世界工业机器人领头羊FANUC(发那科)共话企业AI在工业制造领域的精准落地:2025企业AI落地应用交流会重庆站成功举办

2025年12月12日&#xff0c;司马阅2025企业AI落地应用交流会重庆站在重庆发那科机器人有限公司顺利落幕。本次交流会以“企业AI如何真正落地企业、解决真实问题”为核心议题&#xff0c;汇聚司马阅团队、全球工业机器人头部品牌FANUC(发那科)代表及多位行业相关人士&#xff0c…

作者头像 李华
网站建设 2026/6/11 12:52:17

为什么顶尖团队都在用R+Python做可视化?真相令人震惊

第一章&#xff1a;为什么顶尖团队都在用RPython做可视化&#xff1f;真相令人震惊在数据驱动决策的时代&#xff0c;顶尖科技团队和研究机构正悄然统一技术栈&#xff1a;R 与 Python 的协同可视化方案。这种组合并非偶然&#xff0c;而是基于两者在统计分析与工程化部署上的互…

作者头像 李华