@graphql-codegen生成的Exact<T>类型作用是什么?对查询变量有何影响?
Exact<T> 类型的作用
这个类型是 GraphQL Code Generator 专门针对 TypeScript 原生类型的兼容特性实现的,核心作用就是把对象类型从「开放兼容」改成「严格封闭」,禁止对象携带任何没有在类型里显式声明的额外属性。
TypeScript 原生的对象类型默认是结构兼容的:只要你传入的对象满足类型要求的必填属性、类型匹配,哪怕多带了N个额外属性,只要不是直接给变量字面量赋值,TS 都不会报错。比如下面的代码原生情况下是完全合法的:
// 不用 Exact 时的 FooQueryVariables 定义 type FooQueryVariables = { id: string } const myVars = { id: 'user_123', wrongKey: '我是多余的属性' } function sendQuery(vars: FooQueryVariables) {} sendQuery(myVars) // TS 不会报任何错误
对 FooQueryVariables 的影响
和不使用Exact<T>的情况相比,加了包裹后的FooQueryVariables会有两个明确的约束:
- 必须携带声明的
id字段,且字段类型必须是字符串,这一点和原生情况一致 - 不能携带任何未声明的额外字段,比如上面例子里的
wrongKey,或者拼写错误的idd这类字段,都会直接触发TS类型报错,在开发阶段就能提前发现问题。
这个设计可以避免多余的变量被带到GraphQL请求里,减少不必要的传输开销,也能提前拦截变量名拼写错误这类低级问题。
内容的提问来源于stack exchange,提问作者ruohola
相关产品推荐
相关产品推荐

