class<T> 泛型类

最后更新:2026-10-22

class<T> 泛型类

泛型类(class Stack<T>)让"类的结构"与"存的数据类型"绑定:一个 Stack<number> 实例里只能进出 number。字段、方法参数、方法返回值都可以引用 T,整套状态类型安全。

分组泛型
类型语法
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

class Stack<T> {
  private items: T[] = [];
  push(item: T): void { this.items.push(item); }
  pop(): T | undefined { return this.items.pop(); }
  size(): number { return this.items.length; }
}

const numStack = new Stack<number>();

⚙️ 参数

<T>类级类型参数:new Stack<number>() 时确定,全类共享同一个 T
pop(): T | undefined返回值引用 T:空栈弹出 undefined,类型上如实表达

返回值:方法返回类型随实例的 T 定型:Stack<number> 的 pop() 是 number | undefined。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

2 1
build

(转译后运行输出;numStack.push("1") 会得到编译错误——这个实例的 T 已锁定为 number)

💡 要点

ℹ️ 说明 T 在整个类里是同一个变量:push 进去什么类型,pop 出来就是什么类型——这正是泛型类与 any 容器的本质区别。
💡 提示 静态成员不能引用类的 T:static 是类级别而非实例级别;需要泛型静态逻辑就给 static 方法单独声明类型参数。
⚠️ 注意 类型参数只在实例侧生效:Stack<number> 与 Stack<string> 是两个不兼容的类型,互相赋值会报错。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q new Stack() 不写 <number> 可以吗?
A 可以,构造函数实参能推断时 T 自动确定(new Stack([1, 2]) → Stack<number>);空构造无法推断,会得到 Stack<unknown>,此时建议显式写。
Q 泛型类的继承怎么写?
A 子类要么固定 T:class NumberStack extends Stack<number>;要么带上自己的类型参数:class Box<T> extends Stack<T>——父类参数必须能被子类参数满足。
Q 泛型类和泛型接口配合常见吗?
A 非常常见:interface Repo<T> 定义契约,class MemoryRepo<T> implements Repo<T> 提供实现——契约与实现都保持泛型,业务层拿到精确类型。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏