TypeScript Academy · 课时

泛型约束:收窄类型参数

使用 extends 对泛型施加结构要求

第 2 / 4 课13 个步骤

泛型约束:收窄类型参数 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

欢迎

高级泛型约束可以缩小能够用作类型参数的类型范围,从而支持对复杂结构执行类型安全的操作。

约束回顾

T extends U 会将 T 限制为 U 的子类型。这样,TypeScript 就能在函数内部了解 T 的结构。
function len<T extends { length: number }>(val: T): number {
  return val.length;
}

约束为特定方法

通过将 T 约束为包含特定方法的接口,要求 T 具有该方法。
interface Stringable { toString(): string; }
function stringify<T extends Stringable>(val: T): string {
  return val.toString();
}

从约束中推断

在约束中使用 keyof 来构建安全的访问器。
function pluck<T, K extends keyof T>(items: T[], key: K): T[K][] {
  return items.map(item => item[key]);
}
const names = pluck(users, 'name'); // string[]

高阶类型约束(模拟实现)

TypeScript 不支持真正的高阶类型,但可以使用条件类型和约束来模拟它们。

约束为原始类型

将类型参数限制为特定的原始类型,以实现专用函数。
type Primitive = string | number | boolean | bigint | symbol | null | undefined;
function isPrimitive<T extends Primitive>(val: T): true { return true; }

递归约束

约束可以引用自身,以实现递归模式。
interface Comparable<T> { compareTo(other: T): number; }
function sort<T extends Comparable<T>>(items: T[]): T[] {
  return [...items].sort((a, b) => a.compareTo(b));
}

带默认值的约束

类型参数可以同时具有约束和默认值。默认值必须满足该约束。
function process<T extends object = Record<string, unknown>>(data: T): void {
  console.log(Object.keys(data));
}

T extends Record<string, unknown>

将类型约束为记录类型,以支持动态属性访问。
function getValue<T extends Record<string, unknown>>(obj: T, key: string): unknown {
  return obj[key];
}

返回类型中的约束推断

当 T 受到约束时,TypeScript 会使用该约束来确定返回类型上允许执行的操作。
function firstKey<T extends object>(obj: T): keyof T {
  return Object.keys(obj)[0] as keyof T;
}

NoInfer 工具(TS 5.4)

TypeScript 5.4 引入了 NoInfer,用于阻止从特定参数位置推断类型参数。
function createState<T>(initial: T, fallback: NoInfer<T>): T {
  return initial ?? fallback;
}

快速检查

`T extends { length: number }` 会为泛型函数内部的 T 增加什么信息?

回顾

高级约束可以将泛型类型缩小到特定结构、方法或原始类型联合。将它们与 keyof、递归模式和默认值结合,可以构建强大的类型安全工具。
免费开始

用 AI 导师学习 TypeScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
101
课程
352

常见问题解答

「泛型约束:收窄类型参数」课时是免费的吗?

是的 — 「泛型约束:收窄类型参数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「泛型约束:收窄类型参数」这节课中我会学到什么?

使用 extends 对泛型施加结构要求 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「泛型约束:收窄类型参数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. keyof 与索引访问类型
  2. 泛型约束:收窄类型参数
  3. 条件类型:T extends U ? X : Y
  4. 可分配条件类型
← 返回 TypeScript Academy