NestJS中标注number类型的参数为何运行时为string需Number转换
问题背景
跟随NestJS教程学习时,在service.ts文件中发现如下代码:
public async putCarById(id: number, property_name: string, property_value: string)// : Promise<any> { console.log(id); // 输出传入的值,例如 1 const carId = Number(id); console.log(typeof id); // 输出 "string" console.log(typeof carId); // 输出 "number" // 其余业务逻辑... }
疑问点:id参数已经标注为number类型,为什么还需要通过Number()做类型转换,运行时typeof(id)的输出是"string"类型?
原因解释
- TypeScript的类型标注是编译时静态检查用的,不会对运行时的实际值做任何处理。你写的
id: number只是告诉TS编译器,写代码阶段这个位置传入的值应该是数字类型,如果传字符串就给你报类型错误提示;但TS代码编译成JS运行的时候,所有类型标注都会被完全抹除,根本不会自动帮你做类型转换,运行时传进来的值是什么类型,拿到的就是什么类型,和你写的TS类型标注没有关系。 - 这个方法里的id基本都是从HTTP请求的路径参数(比如
@Put(':id')装饰的路由)或者查询参数里解析出来的,HTTP协议本身传输的路径、查询参数都是纯文本,默认解析出来的原始值全是字符串类型。如果NestJS没有开启自动类型转换配置,就会直接把这个字符串值传到service方法里,所以打印typeof id得到"string"是完全正常的。
补充说明
这里手动调用Number(id)是必要的运行时逻辑:如果不把字符串格式的id转成数字,后续做数据库主键查询、数值计算、全等判断时都会出问题——比如字符串"1"和数字1做===比较时结果是false,不少ORM遇到字符串类型的数字主键会直接查询报错。
如果不想每次手动转参数类型,可以在NestJS启动时给全局ValidationPipe开启transform: true配置,开启后框架会结合你定义的类型标注,自动完成请求参数的运行时类型转换,之后拿到的id就直接是number类型,不需要手动写Number()转换。
内容的提问来源于stack exchange,提问作者digicolp
相关产品推荐
相关产品推荐

