如何为TypeScript推断类型声明额外属性(不修改类)
可行方案整理
方法1:交叉类型 + 类型断言(你的思路优化)
首先可以用TypeScript内置的InstanceType<typeof MyClass>自动获取类的实例类型,再和你的额外属性类型交叉,不用手动维护inferredType:
type AdditionalProps = { myAdditionalProp: string; }; // 自动获取MyClass的实例类型 type MyClassInstance = InstanceType<typeof MyClass>; // 交叉得到包含额外属性的新类型 const myInstance = new MyClass() as MyClassInstance & AdditionalProps; myInstance.myAdditionalProp = "I love typescript.";
方法2:扩展构造函数类型(批量生效)
如果需要多次创建带额外属性的实例,可以修改构造函数的类型签名,让所有实例化调用自动带上属性:
type AdditionalProps = { myAdditionalProp: string; }; // 重新定义构造函数的返回类型 type MyClassWithExtra = typeof MyClass & { new (): InstanceType<typeof MyClass> & AdditionalProps; }; // 断言构造函数符合新类型 const MyClassWithExtraProps = MyClass as MyClassWithExtra; // 直接实例化就能得到带额外属性的对象 const myInstance = new MyClassWithExtraProps(); myInstance.myAdditionalProp = "I love typescript.";
方法3:Object.assign(兼顾类型与运行时)
如果需要运行时实例确实存在该属性(避免类型和实际值不一致),可以用Object.assign同时完成属性添加和类型声明:
type AdditionalProps = { myAdditionalProp: string; }; const baseInstance = new MyClass(); const myInstance = Object.assign(baseInstance, { myAdditionalProp: "I love typescript." }) as InstanceType<typeof MyClass> & AdditionalProps;
注意点
- 方法1、2只是类型层面的扩展,运行时该属性默认不存在,严格模式下直接赋值可能报错;如果需要运行时也有这个属性,优先用方法3。
- 全程避免用
any绕过类型检查,保持类型安全。
内容的提问来源于stack exchange,提问作者bbsimonbb
相关产品推荐
相关产品推荐

