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> 提供实现——契约与实现都保持泛型,业务层拿到精确类型。