CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
TypeScript 进阶/课时/高级类型
RawBlame
课时目录12 节

TypeScript 进阶

  1. 01TS 进阶地图
  2. 02原始类型深入
  3. 03集合类型
  4. 04断言与收窄
  5. 05内置工具类型
  6. 06高级类型
  7. 07类与 OOP
  8. 08函数类型进阶
  9. 09装饰器
  10. 10命名空间
  11. 11工具链
  12. 12综合练习

高级类型

mapped、conditional、literal、template literal、recursive。

35 分钟

高级类型

映射类型、条件类型、字面量类型、模板字面量类型与递归类型是 TypeScript 类型系统的「元编程」层。本课深入这些机制,帮你读懂 nestjs-essentials 与 nextjs-essentials 依赖库中的复杂泛型,并在 typescript-essentials 泛型基础上构建可复用的类型工具。

学习目标

  • 编写 mapped type 批量变换对象属性
  • 使用 conditional type 与 infer 提取类型
  • 用 template literal type 生成字符串联合

映射类型 Mapped Types

type Optional<T> = {
  [K in keyof T]?: T[K];
};

type Nullable<T> = {
  [K in keyof T]: T[K] | null;
};

type ReadonlyDeep<T> = {
  readonly [K in keyof T]: T[K] extends object ? ReadonlyDeep<T[K]> : T[K];
};

interface User {
  id: number;
  profile: { name: string };
}

type PartialUser = Optional<User>;

条件类型 Conditional Types

type IsArray<T> = T extends unknown[] ? true : false;

type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

type ApiResult<T> = T extends { data: infer D } ? D : never;

async function load(): Promise<{ data: Lesson[] }> {
  return { data: [] };
}

type Lessons = UnwrapPromise<ReturnType<typeof load>>; // { data: Lesson[] }
type LessonList = ApiResult<Awaited<ReturnType<typeof load>>>; // Lesson[]

模板字面量类型

type HttpMethod = "GET" | "POST" | "PATCH" | "DELETE";
type ApiPath = `/api/${string}`;

type RouteKey = `${HttpMethod} ${ApiPath}`;

const routes: Record<RouteKey, () => void> = {
  "GET /api/tracks": () => {},
  "POST /api/lessons": () => {},
};

// 事件名模式
type EventName = `on${Capitalize<string>}`;

递归类型

type JsonValue =
  | string
  | number
  | boolean
  | null
  | JsonValue[]
  | { [key: string]: JsonValue };

type DeepPartial<T> = {
  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};

分布式条件类型

type ToArray<T> = T extends unknown ? T[] : never;
type StrOrNumArray = ToArray<string | number>; // string[] | number[]

type NonNullableFields<T> = {
  [K in keyof T]: NonNullable<T[K]>;
};

练习

  • 实现 Mutable<T> 移除 readonly
  • 用 infer 提取函数第一个参数类型
  • 为 REST 路由生成 `$&#123;Method&#125; $&#123;Path&#125;` 联合类型
  • 小结

    映射 + 条件 + 模板字面量 = 类型层面的代码生成,读懂库类型签名的钥匙。 下一课类与 OOP。

    加载本节练习…
    ← 上一课内置工具类型下一课 →类与 OOP