TypeScript中InstanceType泛型参数使用typeof与不使用的差异
TypeScript 两种
InstanceType 写法的核心区别 - 第一种:
InstanceType<typeof UserManager>是合法的常规写法
在 TypeScript 类型上下文里,typeof操作符用于获取对应值的类型,UserManager作为类在运行时本身就是一个构造函数值,typeof UserManager就能拿到这个构造函数的精确类型,包含构造入参、静态成员、返回实例类型等信息,完全符合InstanceType要求传入构造函数类型的泛型约束,最终返回的就是new UserManager()生成的实例的精确类型。 - 第二种:
InstanceType<UserManager>属于错误写法,会直接触发类型报错
在类型上下文直接书写类名UserManager时,默认指代的是该类的实例类型,也就是构造函数生成的实例对象的类型,并非构造函数本身的类型。InstanceType要求泛型入参必须是构造函数类型,传入实例类型会直接触发类型不匹配的校验错误,无法正常使用。
能否将 typeof UserManager 简化为 Function 类型,得到等价于 InstanceType<Function> 的效果?
完全不能,两者效果天差地别:
typeof UserManager是和类绑定的精确构造函数类型,包含该类的所有类型特征,InstanceType基于它推导出来的是该类实例的精确类型,实例的所有属性、方法类型都可以被正常识别和校验。Function是没有任何具体约束的宽泛顶层函数类型,所有函数、构造函数都符合该类型的定义。InstanceType<Function>推导出来的类型是unknown,完全丢失了所有和UserManager相关的类型信息,后续操作该类型的值时无法享受任何 TypeScript 的类型提示和校验能力。
内容的提问来源于stack exchange,提问作者Jacob L
相关产品推荐
相关产品推荐

