如何修复Namespace 'Joi' has no exported member 'extractType'问题
解决Joi 17.2.1下joi-extract-type无法识别extractType的问题
我刚好踩过这个适配的坑,在官方修复类型定义前,本地类型声明是最直接且无侵入的解决方案,另外也给你提供一个替代思路:
方案一:添加本地类型声明文件
创建一个类型声明文件(比如src/@types/joi-extract-type.d.ts),手动给Joi的类型补充extractType的定义,让TypeScript能够识别:
import * as Joi from 'joi'; declare module 'joi' { // 定义从Joi Schema中提取类型的工具类型 type ExtractTypeFromSchema<S> = S extends Joi.Schema<infer T> ? T : never; // 给Joi的根接口添加extractType属性 interface Root { extractType: typeof ExtractTypeFromSchema; } }
之后在你的tsconfig.json中确保类型目录被包含:
{ "compilerOptions": { "typeRoots": ["./src/@types", "./node_modules/@types"] } }
这样你的原有代码export type dto = Joi.extractType<typeof schema>;就能正常编译了——本质是通过TypeScript的模块扩展能力,补全了joi-extract-type未适配Joi 17的类型缺口。
方案二:直接使用Joi Schema的泛型推断(替代方案)
如果你不想额外维护类型声明文件,也可以直接利用Joi Schema本身的内部泛型来提取类型:
// 假设你的schema定义是这样的 const schema = Joi.object({ name: Joi.string().required(), age: Joi.number().optional() }); // 直接从Schema的内部泛型参数中提取类型 export type dto = typeof schema['__type'];
不过这个方法依赖Joi内部的__type属性,属于非公开API,未来版本可能有变动,所以还是方案一更稳妥。
注意事项
等joi-extract-type发布适配Joi 17的正式版本后,记得删除本地的类型声明文件,避免出现类型冲突。
内容的提问来源于stack exchange,提问作者Irshad Ali
相关产品推荐
相关产品推荐

