如何在TypeScript中无需声明Class实现类型与值的双重绑定
解决TypeScript动态生成类的类型与值绑定问题
在TypeScript里,通过函数返回泛型类构造函数时,没法自动让返回的变量同时兼具类型身份。不过可以借助类型推断+typeof关键字来实现近乎自动的效果,不用手动重复写泛型类型。
方法一:用typeof自动推导类型
先修正derive函数的类型定义,让它返回正确的泛型构造函数类型,之后只需要一行代码把变量的类型绑定到同名类型别名上:
class Normal<T> {} // 调整derive函数:传入类型的构造函数,返回绑定泛型后的Normal构造函数 function derive<T>(_: new () => T) { return Normal<T> as typeof Normal<T>; } // 生成类值 const Derived = derive(Number); // 自动推导类型,无需手动写Normal<number> type Derived = typeof Derived; // 现在两种声明都能正常使用 let normal: Normal<number>; let derived: Derived;
这里的核心是typeof Derived会自动识别出它是Normal<number>的构造函数类型,完全不需要手动重复定义泛型参数,只需要把变量的类型赋值给同名类型别名即可。
方法二:封装工具类型简化重复操作
如果觉得每次写type X = typeof X有点繁琐,可以搞个简单的工具类型,但本质还是利用类型推断:
class Normal<T> {} // 只是个占位工具类型,用来简化写法 type BindValueToType<T> = T; function derive<T>(_: new () => T) { return Normal<T> as typeof Normal<T>; } const Derived = derive(Number); type Derived = BindValueToType<typeof Derived>; let derived: Derived; // 正常生效
为什么没法完全自动?
TypeScript里class声明是特殊语法,会同时生成构造函数(值)和实例类型,但const声明的变量只会被当作值处理,不会自动成为类型(字面量类型除外)。动态生成的类本质是变量,触发不了TypeScript对class的特殊处理逻辑,所以必须手动关联类型,但通过类型推断已经能把重复代码降到最低。
批量生成的优化方案
如果你要生成大量这类动态类,可以在编辑器里配置代码片段(比如VS Code的代码片段),一键生成const X = derive(...)加type X = typeof X的组合,使用者只需要替换类型参数就行,能极大简化操作流程。
内容的提问来源于stack exchange,提问作者aghull
相关产品推荐
相关产品推荐

