plainToClass与类型转换的区别及使用疑问
为什么必须用
plainToClass,它和TypeScript的as类型转换到底差在哪? 先搞懂as到底在干嘛
TypeScript里的as只是类型断言——说白了就是你告诉TS:“相信我,这个东西就是这个类型”,但这完全是编译阶段的把戏,编译成JavaScript后,这个断言直接消失,运行时的对象根本没变。
fetch返回的JSON本质就是个普通JS对象(没有任何类的原型关联),哪怕你用as User骗TS说它是User类的实例,运行时它依然是个光秃秃的对象,根本没有User类里定义的方法,调用自然会报错。IDE能提示方法,纯粹是因为TS信了你的断言,它不会去检查运行时的真实对象结构。
再看plainToClass的作用
plainToClass是真刀真枪在运行时干活:它会先创建一个对应类的实例,然后把普通对象的属性一个个赋值到这个实例上,同时让这个实例挂上类的原型链——这样一来,这个实例就真的拥有类里定义的所有方法了,调用起来自然没问题。
举个直观的例子:
class User { name: string; greet() { return `Hello, ${this.name}!`; } } // 用as断言,运行直接报错 const fakeUser = await fetch('/api/user').then(res => res.json()) as User; fakeUser.greet(); // 运行时错误:TypeError: fakeUser.greet is not a function // 用plainToClass,正常运行 const realUser = plainToClass(User, await fetch('/api/user').then(res => res.json())); realUser.greet(); // 正常输出:Hello, xxx!
核心差异总结
as:仅编译时的类型提示,不改变运行时对象,对象还是普通JS对象,没有类方法。plainToClass:运行时创建真实的类实例,绑定原型方法,让对象真正拥有类的所有特性。
内容的提问来源于stack exchange,提问作者cien
相关产品推荐
相关产品推荐

