TypeScript类型安全反序列化:解决JSON转类实例后调用方法报错问题
问题根本原因
TypeScript 的 as 类型断言仅作用于编译阶段,不会修改运行时的对象结构。fetch 返回的JSON反序列化结果是普通 Object 实例,原型链指向 Object.prototype,没有挂载 Person 类定义的 foo 方法,因此运行时调用会抛出类型错误。
Object.assign 方案验证
你当前尝试的写法逻辑是完全可行的:先创建原型指向 Person.prototype 的空对象,再把JSON返回的属性拷贝到该对象上,即可继承 Person 的所有实例方法。可以优化为更符合TypeScript类型规范的写法,避免不必要的any断言:
const person = Object.assign(Object.create(Person.prototype), data) as Person; person.foo(); // 可正常调用
更优的原生实现方案:静态工厂方法
如果后续需要扩展属性校验、默认值填充、嵌套类反序列化等逻辑,更建议在 Person 类中封装专门的反序列化静态方法,维护性和扩展性更强:
class Person { name!: string; age!: number; foo() { console.log("Hey!"); } static fromPlain(obj: Partial<Person>): Person { return Object.assign(new Person(), obj); } }
对应的请求逻辑修改如下:
fetch("/api/data") .then(response => response.json()) .then((plainData) => { const data = Person.fromPlain(plainData); console.log(data); data.foo(); // 正常运行 });
该方案的优势在于可以在fromPlain方法中灵活扩展业务逻辑,比如对传入的age字段做数值类型校验、给缺省的name字段设置默认值等,不需要在业务代码中分散写属性处理逻辑。
内容的提问来源于stack exchange,提问作者Kill KRT
相关产品推荐
相关产品推荐

