TypeScript中如何实例化含declare关键字的类并获取其属性
针对TypeScript声明类的实例化与属性读取方案
一、动态读取类的属性列表
由于.d.ts仅为类型声明文件,编译后不会生成可执行的类实现代码,若对应的实际JS类仅为空构造函数,无法直接从类本身获取属性。可通过两种方式实现:
- 静态解析
.d.ts文件
编写简单的Node脚本,用正则匹配.d.ts里的类属性声明(比如匹配\s+(\w+):\s+\w+,这类规则),批量提取出所有属性名,生成可供业务代码使用的属性列表数组。 - 借助TypeScript类型工具推导
利用keyof操作符提取类型的属性键,再手动维护(或通过脚本生成)属性列表:type AnyModelProps = keyof AnyModel; // 示例:脚本生成的属性列表 const anyModelProps: AnyModelProps[] = ['p1', 'pN'] as const;
二、实例化带默认属性的对象
原声明类无属性初始化逻辑,new出来的对象为空,可通过以下方式生成带属性的实例:
- 对象合并初始化
定义包含默认值的属性对象,与空实例合并:const defaultAnyModel: AnyModel = { p1: '', pN: 0 }; const obj = Object.assign(new AnyModel(), defaultAnyModel); - 直接创建符合类型的对象
无需调用构造函数,直接创建满足类型定义的对象,TypeScript会认可其为目标类型实例:const obj: AnyModel = { p1: '', pN: 0 }; - 封装通用实例化工具函数
结合属性列表,编写通用函数批量初始化属性:function createModelInstance<T>(cls: new () => T, defaultValues: Partial<T>): T { const instance = new cls(); Object.assign(instance, defaultValues); return instance; } // 使用示例 const obj = createModelInstance(AnyModel, { p1: '', pN: 0 });
内容的提问来源于stack exchange,提问作者A.B.
相关产品推荐
相关产品推荐

