跳转到正文
ieuforuruntime notes
↩ WRITING

TypeScript / 02 MIN

TypeScript + React:从 Type 到 Reality

类型检查通过后,UI 是怎样出现在屏幕上的?分清 TypeScript、React 与浏览器各自的职责。

2 MIN READ

TypeScript 和 React 解决的是不同层次的问题。


三层模型

TypeScript
    ↓
约束程序可以是什么

React
    ↓
描述 UI 应该是什么

Browser
    ↓
把 Description 实现成 Reality

TypeScript 负责在程序运行之前,通过静态分析缩小错误空间。

React 负责把 UI 表达成可计算的 Description。

Browser 负责最终把 Description 变成真实的用户界面。


TypeScript:约束程序

TypeScript 不是给 JavaScript 补类型。

它是在动态系统中,添加一层静态约束。

// 类型约束了函数可以接受什么、返回什么
function greet(name: string): string {
  return 'Hello, ' + name.toUpperCase()
}

// 类型约束了组件可以接受什么 props
interface ButtonProps {
  variant: 'primary' | 'secondary'
  children: React.ReactNode
}

// 类型约束了系统可以处于哪些状态
type State =
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'success'; data: User }
  | { status: 'error'; error: Error }

TypeScript 负责"程序可以是什么"。


React:描述 UI

React 不是直接操作 DOM。

它描述 UI 应该是什么,Browser 负责实现。

function App() {
  const [count, setCount] = useState(0)

  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount((c) => c + 1)}>+</button>
    </div>
  )
}

这段代码描述了 UI 的状态和行为,但没有直接操作 DOM。React 通过 Fiber、Reconciler、Scheduler 把这个描述变成真实的 DOM 更新。

React 负责"UI 应该是什么"。


Browser:实现 Reality

Browser 最终把 React 的描述变成像素。

React Commit
    ↓
DOM Mutation
    ↓
Style Calculation
    ↓
Layout
    ↓
Paint
    ↓
Composite
    ↓
Pixels

Browser 负责"Reality 是什么"。


共同的目标

这和 React 的设计哲学一致:

  • React 在运行时维护确定性(Fiber、Scheduler、Lane)
  • TypeScript 在编译时维护确定性(类型检查、泛型约束、条件类型)

两者共同的目标:

在动态系统中,把尽可能多的问题提前暴露,把复杂性控制在边界之内。


回到起点

TypeScript 不是给变量加类型。

它是在程序运行之前,缩小错误空间。

React 不是操作 DOM。

它是描述 UI 应该是什么。

Browser 不是执行代码。

它是把描述变成 Reality。

三者各司其职,共同在动态系统中维护确定性。


这就是 TypeScript 与 React 的关系。


同系列文章 10
  1. TypeScript 7:Go 重写与实现的分离
  2. LSP 是什么:编辑器和语言的桥梁
  3. 为什么 React 的 TypeScript 体验如此自然
  4. 为什么 Vue/Angular 生态需要额外的工具链
  5. TypeScript 的本质:编译时约束
  6. 类型系统的核心:结构化类型
  7. 泛型:让逻辑与类型解耦
  8. 条件类型与 Discriminated Unions
  9. Type-driven React:类型驱动的组件设计
  10. TypeScript + React:从 Type 到 Reality