泛型函数:类型参数
为函数添加类型参数以实现复用
泛型函数:类型参数 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
欢迎
泛型让您能够编写适用于任意类型的函数,同时保留类型安全性。您不使用 `any`,而是使用类型参数,在调用函数时再确定其类型。
泛型解决的问题
返回 `any` 的函数会丢失类型信息。泛型可以保留输入类型与输出类型之间的关系。
// Without generics — loses type info
function first(arr: any[]): any { return arr[0]; }
// With generics — type-safe
function first<T>(arr: T[]): T { return arr[0]; }类型参数语法
在参数列表之前使用尖括号 `` 声明类型参数。在参数和返回类型中使用 T。
function identity<T>(value: T): T {
return value;
}
const n = identity(42); // T is number
const s = identity('hello'); // T is string泛型函数的类型推断
TypeScript 会根据实际参数推断类型实参。您很少需要显式指定它。
function wrap<T>(val: T): T[] { return [val]; }
const nums = wrap(42); // T inferred as number -> number[]
const strs = wrap('hi'); // T inferred as string -> string[]多个类型参数
函数可以拥有多个类型参数。
function pair<A, B>(a: A, b: B): [A, B] {
return [a, b];
}
const p = pair(1, 'hello'); // [number, string]泛型数组函数
对于适用于任意元素类型的数组工具函数,泛型必不可少。
function filterNull<T>(arr: (T | null)[]): T[] {
return arr.filter((x): x is T => x !== null);
}显式类型实参
当 TypeScript 无法推断类型时,您可以显式提供类型实参。
function create<T>(): T | null { return null; }
const user = create<User>(); // T cannot be inferred — must be explicit泛型与 any
与 `any` 不同,泛型可以在整个函数中保持类型之间的关系。返回类型会与输入类型关联起来。
function echo<T>(val: T): T { return val; }
const n: number = echo(42); // OK
// const s: string = echo(42); // Error — T is number泛型箭头函数
箭头函数使用相同的语法,但在 .tsx 文件中需要添加逗号,以便与 JSX 标签区分开来。
const identity = <T>(val: T): T => val;
// In .tsx files:
const identity2 = <T,>(val: T): T => val;返回不同的类型
泛型函数可以通过转换方式使用类型参数。
function mapArray<T, U>(arr: T[], fn: (item: T) => U): U[] {
return arr.map(fn);
}
const lengths = mapArray(['hello', 'world'], s => s.length);
// lengths: number[]带默认值的泛型参数
为类型参数提供默认类型,使其成为可选参数。
function createList<T = string>(): T[] { return []; }
const list = createList(); // T defaults to string快速检查
`identity(42)` 的返回类型是什么?
回顾
泛型函数使用类型参数(T)来保留输入与输出之间的类型关系。TypeScript 会自动推断类型实参。请使用泛型而不是 any 来编写可复用且类型安全的工具函数。
常见问题解答
「泛型函数:类型参数」课时是免费的吗?
是的 — 「泛型函数:类型参数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「泛型函数:类型参数」这节课中我会学到什么?
为函数添加类型参数以实现复用 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「泛型函数:类型参数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 泛型函数:类型参数
- 泛型接口与类型别名
- 使用 extends 约束泛型
- 默认类型参数