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 数组。引用只能朝"已声明"的方向,不能反过来。
Web-Tutorial.com

Web-Tutorial 技术团队

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

100%

🙏 帮我们做得更好

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

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