Typescript await toPromise类型转换报错:Building类型不兼容typeof Building
解决TypeScript错误TS2322:Type 'Building' is not assignable to type 'typeof Building'
这个错误其实很好理解——你大概率是把Building类的实例对象,当成了类本身(也就是构造函数)来使用了。typeof Building指的是类的构造函数类型,而你传入的是已经new出来的Building实例,两者类型完全不匹配,所以TypeScript才会抛出“缺少prototype属性”的提示(因为只有构造函数才有prototype,实例是没有的)。
下面是几种常见的出错场景和对应的解决办法:
场景1:把实例传给了需要构造函数的函数
比如你可能写了这样的代码:// 某个函数要求接收Building类作为参数 function registerBuildingClass(cls: typeof Building) { // 这里可能需要用cls来new实例,或者访问类的静态属性 } // 错误操作:传入了实例,而不是类本身 const myBuilding = new Building(); registerBuildingClass(myBuilding); // 这里触发TS2322错误解决办法:直接传入类本身即可:
registerBuildingClass(Building); // 正确场景2:变量类型定义和赋值不匹配
比如你定义了一个用来存构造函数的变量,却给它赋值了实例:// 变量声明为构造函数类型 let buildingConstructor: typeof Building; // 错误:给它赋值了实例 buildingConstructor = new Building();解决办法分两种情况:
- 如果变量确实是用来存构造函数的,就赋值类本身:
let buildingConstructor: typeof Building = Building; - 如果变量是用来存实例的,就修改变量类型为
Building:let buildingInstance: Building = new Building();
- 如果变量确实是用来存构造函数的,就赋值类本身:
场景3:在框架依赖注入中误用实例
如果你在用Angular这类框架,可能在配置提供者时不小心传了实例:// 错误写法 @Component({ providers: [new Building()] }) export class FloorManagerComponent { /* ... */ }解决办法:提供者应该传入类本身,框架会自动帮你实例化:
@Component({ providers: [Building] }) export class FloorManagerComponent { /* ... */ }
如果上面的场景都不符合你的情况,建议你仔细检查第42行附近的代码,看看你是在哪里把Building实例赋值给了需要typeof Building类型的位置,只要把实例换成类本身,或者调整变量/参数的类型定义,就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Kamil Kiełczewski
相关产品推荐
相关产品推荐

