Typescript是否存在可省略必填对象属性的泛型参数类型?
结论
首先明确:你所设想的、无需修改原有泛型结构即可省略必选属性的「魔法类型」在TypeScript中不存在。
TypeScript对象类型的必选属性约束是类型本身的固有属性,和属性对应的泛型类型无关。只要你将属性定义为必选(没有加?:),无论给泛型传入什么类型,你都必须在对象中显式声明该属性,无法直接省略。
适配需求的最优实现方案
你可以通过条件类型改造你的HttpRequest泛型定义,即可实现「不需要的字段直接省略」的效果,不需要手动组合多个HasXXX类型:
// 泛型默认值设为never,不需要的字段可以直接不传 type HttpRequest<Body = never, Query = never, Path = never, Headers = never> = (Body extends never ? {} : { body: Body }) & (Query extends never ? {} : { query: Query }) & (Path extends never ? {} : { path: Path }) & (Headers extends never ? {} : { headers: Headers })
之后你只需要给不需要使用的字段传入never,即可直接省略对应属性,完全符合你的使用需求:
// Query和Headers字段传入never,即可直接省略不写 const x: HttpRequest<{ test: number }, never, { foo: string }, never> = { body: { test: 1 }, path: { foo: "bar" }, }
如果连续多个不需要的字段在泛型末尾,你甚至可以直接省略不传:
// 只需要body和query,后面Path、Headers的泛型默认就是never,直接省略即可 const req: HttpRequest<{ id: number }, { page: number }> = { body: { id: 123 }, query: { page: 1 } }
内容的提问来源于stack exchange,提问作者Balázs Édes
相关产品推荐
相关产品推荐

