TypeScript泛型函数体内Special类型约束未生效如何解决?
TypeScript泛型校验失效问题解答
核心错误原因
你在函数体内为变量标注类型时,传入了错误的泛型参数:
你写的Special<typeof controller>中,typeof controller取的是类构造函数本身的类型,遍历的是构造函数的静态属性、原型等属性,并非你要校验的类实例的属性,因此不会触发实例属性的合规性校验。
你定义的Class<T>泛型中,T本身就代表类的实例类型,直接将T传入Special即可触发预期校验。
函数体内校验的正确写法
修改函数体内变量的类型标注即可:
type Class<ClassType = any, constructorParams = any> = { new (...agrs: Array<constructorParams>): ClassType; }; type Special<C> = { [Prop in keyof C]: C[Prop] extends Function | string ? C[Prop] : never; } class A { public msg: string = 'Hello!'; public test() {} public num: number = 123; } const Testing = <T>(controller: Class<T>) => { // 传入实例类型T作为Special的泛型参数 const a: Special<T> = new controller(); // 此处会触发类型错误 }; Testing(A); // 调用阶段也会同步抛出错误
两种校验方案的选择
- 函数体内标注类型:校验逻辑仅作用于函数内部变量,适合仅内部逻辑需要校验的场景
- 入参直接约束为
Class<Special<T>>:校验逻辑提前到函数调用阶段,传入不符合要求的类时直接报错,更早发现问题,更适合工程化项目使用
泛型约束生效说明
TypeScript的泛型约束在函数体内完全生效,你之前未触发校验是类型标注的传参错误导致,并非泛型本身的特性问题。
内容的提问来源于stack exchange,提问作者Grizzly
相关产品推荐
相关产品推荐

