T = Default 泛型默认值
最后更新:2026-10-22
T = Default 泛型默认值
类型参数可以有默认值(<T = string>):不指定时自动采用默认类型,指定了则用指定值。与函数默认参数同思路——"常用场景零配置,特殊场景可覆盖",让泛型 API 用起来更顺手。
| 分组 | 泛型 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
interface Paginated<T = string, Page = number> {
page: Page;
items: T[];
}
const names: Paginated = { page: 1, items: ["ann", "bob"] }; // 用默认
const orders: Paginated<{ id: number; total: number }> = { page: 2, items: [] }; // 覆盖 T
⚙️ 参数
| T = string | 带默认值的类型参数:使用处可完全省略 |
|---|---|
| Page = number | 第二个参数也有默认值:覆盖 Page 时需按位置连带写出 T |
返回值:默认值只影响"实例化省略时用哪个类型",实例化后的类型行为与显式指定完全一致。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
ann,bob 2 7
(转译后运行输出;orders.items 里塞字符串会得到编译错误——T 已被覆盖为订单对象)
💡 要点
ℹ️ 说明 默认值可以是任意类型表达式:具体类型(string)、另一个参数(T = Page[])甚至条件类型——默认值本身可以做类型运算。
⚠️ 注意 类型参数按位置填充:想覆盖第二个参数 Page 时,第一个参数 T 必须一并写出(可写它的默认占位)。
💡 提示 公共库的泛型类型几乎都该带默认值(如 Paginated<T = unknown>):初学者不用理解类型参数也能上手,进阶者随时精确指定。
🏷️ 相关泛型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 默认值和约束一起用有什么讲究?
A 默认值必须满足约束:<T extends HasId = User> 合法(User 兼容 HasId),<T extends HasId = string> 报错。默认值是"兜底的具体类型",约束是"准入门槛"。
Q 泛型类的默认值在什么时候生效?
A new Stack() 不带实参且无法推断时用默认:class Stack<T = string> 的 new Stack() 得到 Stack<string>;传了构造实参则推断优先于默认。
Q 默认值能引用前面的类型参数吗?
A 能:interface Pair<K = string, V = K[]>——V 默认为 K 数组。引用只能朝"已声明"的方向,不能反过来。