You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:37:40