如何强制类泛型必须显式传入,禁止自动推导?
解决TypeScript泛型必须显式传入的问题
要实现让new Test({a: 1})这类隐式推导泛型的写法报错,强制必须显式指定泛型参数,我们可以利用TypeScript的泛型默认值和条件类型来阻断自动推导逻辑,具体方案如下:
实现代码
class Test<P = never> { constructor(data: P extends never ? never : P) {} }
效果验证
- 错误写法(会触发类型检查失败):
// 报错:类型"{ a: number; }"的参数不能赋给类型"never"的参数。 new Test({ a: 1 }); - 正确写法(符合要求,正常通过检查):
new Test<{a: number}>({ a: 1 });
原理说明
这里的核心思路是:
- 给泛型
P设置默认类型never,当用户不显式指定泛型时,P会被自动设为never。 - 通过条件类型
P extends never ? never : P,构造函数的参数类型会根据P是否为默认的never来动态变化:- 若未显式指定
P,参数类型为never,而普通对象字面量无法赋值给never,直接触发类型错误。 - 若显式指定了
P,参数类型就会变成指定的P类型,此时传入匹配的参数就能正常通过检查。
- 若未显式指定
这种方案既满足了强制显式传泛型的需求,又不会影响正常显式传参后的类型校验,是比较简洁的实现方式。
内容的提问来源于stack exchange,提问作者aweiu
相关产品推荐
相关产品推荐

