TypeScript中如何扩展原始类型类,让实例被识别为原生原始类型
解决方案
你遇到的是TypeScript类型层面的限制,运行时new NumberInput(1) + 1本身可以正常执行(JS会自动调用继承自Number的valueOf()方法获取原始值参与运算),只需要让TypeScript类型系统把NumberInput实例识别为兼容number原始类型即可。
核心实现方案
利用TypeScript的声明合并特性,新增一个和类同名的接口,让NumberInput类型同时兼容number原始类型:
export class NumberInput extends Number { // 此处编写你自定义的类逻辑,示例如下: double() { return this.valueOf() * 2 } } // 关键:同名接口合并,让实例兼容number类型 export interface NumberInput extends number {}
效果验证
修改完成后,不需要额外的类型断言或者手动调用valueOf(),代码可以直接通过类型检查:
// 算术运算直接生效 const x = new NumberInput(1) + 1 // 类型推断x为number,运行时结果为2 // 自定义方法也可以正常调用 const y = new NumberInput(3).double() // 类型推断y为number,运行时结果为6
实现原理
TypeScript中同名的类和接口会自动合并类型,通过让接口继承number,相当于给NumberInput的实例类型追加了number原始类型的兼容性,既保留了类本身的自定义方法能力,又可以直接作为原始数值参与运算。
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

