news 2026/4/16 18:10:31

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/4/15 16:22:57

QTextEdit方法大全

&#x1f4d8; 第一部分&#xff1a;构造函数 文本获取与设置方法&#x1f539;【构造函数】1. *QTextEdit(QWidget parent nullptr)创建一个空的多行文本输入框。示例&#xff1a;QTextEdit* edit new QTextEdit(this);2. *QTextEdit(const QString &text, QWidget par…

作者头像 李华
网站建设 2026/4/16 12:27:12

如何用角色+属性双引擎实现 Dify 混合检索的动态权限控制?

第一章&#xff1a;混合检索的 Dify 权限控制在构建基于 Dify 的智能应用时&#xff0c;混合检索机制与权限控制系统是保障数据安全与查询效率的核心组件。通过精细化的权限设计&#xff0c;可以确保不同角色仅能访问其授权范围内的知识库与检索结果&#xff0c;同时支持关键词…

作者头像 李华
网站建设 2026/4/16 12:28:50

揭秘R-Python模型部署难题:如何实现高效无缝同步?

第一章&#xff1a;R-Python模型部署同步的挑战与背景在现代数据科学实践中&#xff0c;R 和 Python 是两种最广泛使用的编程语言。尽管它们各自拥有强大的建模能力和丰富的生态系统&#xff0c;但在实际生产环境中&#xff0c;将基于 R 训练的模型与基于 Python 构建的服务系统…

作者头像 李华
网站建设 2026/4/16 15:30:03

从入门到精通:Dify分支跳转配置的8个必知场景

第一章&#xff1a;Dify工作流分支跳转的核心概念Dify 工作流中的分支跳转机制是实现复杂业务逻辑编排的关键能力。通过条件判断与动态路径选择&#xff0c;开发者可以控制执行流程在不同节点之间灵活流转&#xff0c;从而满足多样化的应用场景需求。分支跳转的基本原理 分支跳…

作者头像 李华
网站建设 2026/4/16 5:56:15

科研工作者必备:LobeChat辅助论文写作全流程

科研工作者必备&#xff1a;LobeChat辅助论文写作全流程 在当今科研节奏日益加快的背景下&#xff0c;研究者们不仅要产出高质量成果&#xff0c;还要在写作、表达和传播上下足功夫。一篇论文从构思到发表&#xff0c;往往要经历数周甚至数月的反复打磨——文献调研耗时、结构设…

作者头像 李华
网站建设 2026/4/16 12:42:28

从零到上线,Dify与Spring AI模型对接全解析,开发者必看

第一章&#xff1a;从零起步&#xff0c;全面认识Dify与Spring AI集成核心在人工智能快速发展的背景下&#xff0c;Dify 作为一款开源的低代码 AI 应用开发平台&#xff0c;正逐步成为企业级智能服务构建的重要工具。它提供了可视化编排、模型管理、插件扩展等能力&#xff0c;…

作者头像 李华