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 的关系。