You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中<T = {}>语法含义及对应的约束规则是什么?

问题解答

你看到的 <T = {}> 语法不是泛型约束,它是泛型参数默认值,和泛型约束(需要用extends关键字实现)是完全独立的两个泛型语法特性,这也是你在泛型约束专属文档中找不到对应说明的原因。你看到的注释提到的「泛型约束」实际是指GConstructor这个类型整体常被用来做泛型约束(比如Mixin函数中限制传入的参数必须是构造函数类型),并非<T = {}>本身是约束。


1. <T = {}>的工作原理

泛型参数默认值的作用是:当你使用这个泛型类型时,如果没有显式指定泛型参数的具体类型,TypeScript 会自动使用你设置的默认值作为泛型参数的类型。
对应到你给出的代码:

type GConstructor<T = {}> = new (...args: any[]) => T;
  • 当你显式传入泛型参数时,比如GConstructor<User>,此时T的类型就是你传入的User,整个类型表示「可以实例化出User类型对象的构造函数」
  • 当你没有传入泛型参数时,比如直接写GConstructor,此时T会自动使用默认值{},整个类型表示「可以实例化出空对象类型的构造函数」

2. 它具体施加了哪些约束?

单纯的<T = {}>本身没有施加任何类型约束,你可以给T传入任意合法的TypeScript类型(包括null、undefined、原始类型、函数类型等),都不会触发类型报错。

很多时候这个类型会和泛型约束搭配使用,写法如下:

type GConstructor<T extends {} = {}> = new (...args: any[]) => T;

这里的T extends {}才是真正的泛型约束,它限制了T必须是「非null、非undefined的类型」,因为在TypeScript的类型系统中,{}空对象类型兼容所有非空非undefined的类型(包括字符串、数字等原始类型,因为原始类型会在需要的时候自动装箱为包装对象)。


补充:为什么Mixin文档中要给T设置默认值为{}?

Mixin 模式的常见使用场景是给类的实例扩展功能,类的实例默认都是对象类型,将T的默认值设为{}符合绝大多数场景的使用预期,不需要开发者每次使用的时候都手动传入泛型参数,减少冗余代码。


内容的提问来源于stack exchange,提问作者Sámal Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:36:03