如何让TypeScript识别类实例constructor的静态成员与方法?
问题
在纯JavaScript中,以下代码可以正常运行:
class Post { static table = "Posts" title = "" } const post = new Post() console.log(post.constructor.table) // 输出"Posts"
但TypeScript无法识别类实例的constructor属性可以访问类的静态成员与方法,它会将post.constructor判定为Object.constructor,导致post.constructor.table被标记为不存在的属性。
我需要让TypeScript正确识别post.constructor.table的存在,目前找到了一种可行但十分繁琐的实现方式:
import type { Class, Constructor, EmptyObject } from "type-fest" // 重写类实例类型的constructor函数,使其包含类的静态成员 type OverrideConstructorToIncludeStatic< T, Static = EmptyObject, Arguments extends unknown[] = any[], > = T & { constructor: Static & Constructor<T, Arguments> } // 增强Class类型,支持定义类的预期静态成员 type ClassWithStatic< T, Static = EmptyObject, ConstructorArguments extends unknown[] = any[], > = Class< OverrideConstructorToIncludeStatic<T, Static, ConstructorArguments>, ConstructorArguments > & Static type HasTable = { table: string } type ClassHasTable<T> = ClassWithStatic<T, HasTable> function extend<T>(classType: Class<T> & HasTable): ClassHasTable<T> { return classType as ClassHasTable<T> } const Post = extend(class Post { static table = "Posts" title = "" }) const post = new Post() post.constructor.table // TypeScript不再报错
这种方式需要用extend函数包裹类定义,写法繁琐,对库的使用者不够友好。有没有更简洁的实现方案?
补充说明
上述是简化示例,实际场景是实现类对象的序列化与反序列化,要求类遵循包含静态方法的特定接口,目标是后端序列化类对象后,前端可以反序列化。但后来意识到这几乎无法实现,因为需要序列化classRegister Map,而这只能通过eval实现,存在安全风险。
内容的提问来源于stack exchange,提问作者Evert
相关产品推荐
相关产品推荐

