如何编写含必填与多可选未知属性的TypeScript MyRequest类
实现支持必填字段与未知可选参数的MyRequest类
要实现这个需求,核心是先确保必填字段存在,再接收所有额外的未知参数,下面给出两种实用的实现方案,你可以根据代码风格选择:
方案一:直接挂载所有属性到实例(简洁直观)
这种方式会把请求体里的所有字段(包括必填和可选)直接挂载到MyRequest实例上,访问起来最直接:
class MyRequest { constructor(body) { // 校验必填字段,缺失则抛出错误 if (!body?.name || !body?.username) { throw new Error('name和username为必填字段,不能为空'); } // 将请求体所有属性合并到当前实例 Object.assign(this, body); } // 可选:添加便捷的属性获取方法(按需使用) getField(key) { return this[key]; } }
使用示例
// 假设req.body是 { name: "张三", username: "zhangsan", age: 25, address: "北京" } const myRequest = new MyRequest(req.body); // 直接访问属性 console.log(myRequest.name); // 张三 console.log(myRequest.username); // zhangsan console.log(myRequest.age); // 25 console.log(myRequest.address); // 北京
方案二:分离必填字段与额外字段(结构清晰)
如果希望明确区分必填字段和可选/未知字段,可以把额外字段统一存到单独属性中,便于后续管理:
class MyRequest { constructor(body) { // 解构出必填字段,剩余字段存入extra const { name, username, ...extraFields } = body; // 校验必填字段 if (!name || !username) { throw new Error('name和username为必填字段,不能为空'); } // 挂载必填字段 this.name = name; this.username = username; // 存储所有可选/未知字段 this.extra = extraFields; } }
使用示例
const myRequest = new MyRequest(req.body); // 访问必填字段 console.log(myRequest.name); // 张三 // 访问额外字段 console.log(myRequest.extra.age); // 25 console.log(myRequest.extra.address); // 北京
补充说明
- 校验逻辑可按需扩展,比如检查字段类型、长度限制等;
- 如果用TypeScript,可添加类型定义让代码更健壮:
type ExtraFields = Record<string, any>; class MyRequest { name: string; username: string; [key: string]: any; // 支持任意额外属性(对应方案一) constructor(body: { name: string; username: string } & ExtraFields) { if (!body.name || !body.username) { throw new Error('name和username为必填字段,不能为空'); } Object.assign(this, body); } }
内容的提问来源于stack exchange,提问作者Sh4dy
相关产品推荐
相关产品推荐

