TypeScript导入类型时typeof关键字的作用解析
TypeScript中import type导入构造函数类型后实例化报错的原因解析
问题场景
在MyPublisher类的publish方法中,若将参数Foo的类型指定为通过import type从@aws-sdk/client-sns导入的PublishCommand,在TypeScript 5中执行new Foo()时会触发错误:This expression is not constructable.。但将参数类型改为typeof PublishCommand后,代码即可正常运行。
关键原因拆解
import type的作用边界import type是TypeScript专为导入纯类型信息设计的语法,编译时会被完全剔除,不会保留任何运行时相关的引用。通过它导入的PublishCommand,仅仅是该类实例的类型描述,而非类的构造函数本身。实例类型与构造函数类型的区别
PublishCommand对应的是类实例的类型,描述的是new PublishCommand()生成的对象的结构,它本身不具备可构造性,不能被new调用。typeof PublishCommand对应的是类构造函数的类型,描述的是PublishCommand这个构造函数本身(JavaScript中类本质就是构造函数),这个类型代表的是可被new执行的函数,因此能正常完成实例化。
typeof在这里的实际意义
这里的typeof并非作用于“类型”,而是作用于PublishCommand对应的构造函数标识——即便用import type导入,TypeScript在编译阶段仍能关联到该类构造函数的类型信息,typeof PublishCommand就是获取这个可构造的函数类型,从而解决实例化报错的问题。
内容的提问来源于stack exchange,提问作者Thibaud Auzou
相关产品推荐
相关产品推荐

