# TypeScript 2026 学习实验台

直接在浏览器打开`index.html`，选择主题并运行等价 JavaScript；页面不内嵌 TypeScript 编译器，因此不会把静态示例伪装成运行时校验。

## 先学什么

1. 编译边界：`type`、`interface`、泛型和工具类型在编译后消失。
2. 结构类型：赋值看对象拥有的成员，不看是否显式声明了某个接口。
3. 联合与收窄：用可辨识联合表达成功、失败等互斥业务状态。
4. `unknown` 与类型守卫：网络、存储和消息输入必须在运行时验证。
5. 泛型与工具类型：让领域类型在函数、分页、PATCH DTO 和视图模型中继续流动。

## 项目配置

在真实项目中把 TypeScript 作为本地开发依赖，而不是依赖全局安装：

```bash
npm i -D typescript
npx tsc --init
npx tsc --noEmit
```

推荐从严格模式起步：

```json
{
    "compilerOptions": {
        "strict": true,
        "noUncheckedIndexedAccess": true,
        "exactOptionalPropertyTypes": true,
        "noEmit": true
    }
}
```

`noEmit` 适合单独的类型检查任务；应用构建通常由 Vite、Next.js 或项目现有工具产出 JavaScript。

## Java 对照

| Java                       | TypeScript                     |
|----------------------------|--------------------------------|
| 接口通常通过 `implements` 形成名义关系 | 接口主要按对象形状兼容                    |
| 反射可读取部分类型信息                | `type` / `interface` 默认不在运行时存在 |
| 泛型参与编译期检查                  | 泛型也会被擦除，不能据此校验 JSON            |
| Bean Validation 可校验输入      | 使用类型守卫或运行时 schema 校验未知输入       |

不要用 `as User` 代替输入校验：类型断言只影响编译器，不会转换或验证运行时数据。
