TypeScript/ESLint未检测到无效函数名编译错误原因咨询
这类错误属于TypeScript/ESLint应检测的编译错误范畴
代码中的具体错误
你的代码存在两处明确的语法/API调用错误:
Joi.any()``.forbidden():误用了标签模板语法,Joi.any()返回的是Joi Schema对象,并非可作为标签模板的函数,正确写法应为Joi.any().forbidden()Joi.number()optional():漏写了成员访问的点运算符,正确写法应为Joi.number().optional()
TypeScript的检测能力
只要满足以下两个前提,TypeScript完全可以在编译阶段检测到这些错误:
- 已安装
@types/joi包(提供Joi的官方类型定义) - TypeScript配置中开启了
strict模式(或至少启用strictNullChecks、noImplicitAny等核心类型检查规则)
对应的检测逻辑:
- 针对
Joi.number()optional():TypeScript会识别到Joi.NumberSchema类型上不存在名为optional的方法,直接抛出类型错误 - 针对
Joi.any()``.forbidden():TypeScript会检测到标签模板的标签必须是函数类型,而Joi.AnySchema不属于函数类型,因此抛出类型不匹配的错误
ESLint的检测能力
通过配置合适的规则,ESLint也能提前捕捉这类问题:
- 启用
no-unexpected-multiline规则:可识别Joi.any()``.forbidden()这种容易引发误解的语法误用 - 启用
@typescript-eslint/no-unsafe-call、@typescript-eslint/no-unsafe-member-access等规则:能检测到对不存在的方法/属性的调用
未检测到错误的可能原因
大概率是以下情况之一:
- 未安装
@types/joi,TypeScript无法识别Joi对象的类型结构 - TypeScript的
strict模式未开启,类型检查强度不足 - ESLint未配置上述相关规则,或未集成
@typescript-eslint插件
修复方案
- 修正代码错误:
export function getHeaderLinkValidationSchema() { const { stage } = process.env; return Joi.object() .keys({ "header": stage === "prod" ? Joi.any().forbidden() : Joi.number().optional(), }) .required() .unknown(); }
- 安装Joi类型定义:
npm install --save-dev @types/joi
- 在
tsconfig.json中开启strict模式:
{ "compilerOptions": { "strict": true } }
- 配置ESLint规则(在
.eslintrc中添加):
{ "rules": { "no-unexpected-multiline": "error", "@typescript-eslint/no-unsafe-call": "error", "@typescript-eslint/no-unsafe-member-access": "error" } }
内容的提问来源于stack exchange,提问作者athor
相关产品推荐
相关产品推荐

