TypeScript调用可选参数函数报错:为graphql-cli的get-schema打补丁遇TS2554
printSchema传入第二个参数时报错的问题 你遇到的这个问题核心是Flow类型定义和TypeScript的类型声明不同步导致的,下面详细分析原因和对应的解决办法:
问题根源
虽然你查看的Flow版本printSchema函数签名明确支持第二个可选的Options参数,但TypeScript在编译时依赖的是@types/graphql包提供的TypeScript类型声明文件(.d.ts),而不是Flow的.js.flow文件。如果你的项目中@types/graphql版本较低,还没有更新到包含printSchema第二个参数的定义,TypeScript就会判定你传入了多余的参数,从而抛出TS2554错误。
具体解决步骤
1. 升级@types/graphql到支持该参数的版本
首先检查当前项目中@types/graphql的版本:
npm list @types/graphql
printSchema的第二个参数是在@types/graphql的14.5.0版本左右加入的,如果你的版本低于这个,执行升级命令:
npm install @types/graphql@latest --save-dev
升级完成后重新运行npm install和编译命令,通常就能解决这个类型错误。
2. 用类型断言临时绕过TypeScript检查
如果因为graphql-cli依赖的graphql核心包版本限制,无法升级@types/graphql,可以使用any类型断言来绕过TS的类型校验:
// 把printSchema断言为any类型,跳过参数检查 (printSchema as any)(newSchemaResult as GraphQLSchema, { commentDescriptions: true })
这种方法虽然不够规范,但作为临时补丁是快速有效的。
3. 手动更新类型定义文件(临时方案)
如果上面两种方法都不可行,你可以手动修改node_modules/@types/graphql/utilities/schemaPrinter.d.ts中的函数签名,添加第二个可选参数:
export function printSchema(schema: GraphQLSchema, options?: { commentDescriptions?: boolean }): string;
注意:这种修改会在下次执行npm install时被覆盖,只适合临时测试使用。
4. 确认导入路径的正确性
最后再确认你导入的printSchema是否来自正确的模块:
import { printSchema } from 'graphql/utilities';
避免不小心导入了自定义的或者旧版本的printSchema函数,导致类型不匹配。
内容的提问来源于stack exchange,提问作者Hendrik Poernama

