将路由移至外部文件后Deno中TypeScript类型报错问题
问题原因与解决办法
原因
Deno的模块导入基于URL,只要两个文件导入oak时用的URL版本不同,Deno就会下载并使用两个独立的包。不同版本的oak内部的Context、Router等类型定义存在差异——哪怕你用的是原生JS文件,Deno默认会对JS文件做类型检查(比如默认启用的@ts-check),TypeScript会判定不同版本的Router实例类型不兼容,因此抛出app.use()参数类型不匹配的错误。
解决办法
1. 统一oak依赖版本(根本解决)
确保server.ts和routes.js导入的是完全相同版本的oak:
- 直接在两个文件里使用相同的导入URL,比如都写:
import { Router } from "https://deno.land/x/oak@v12.5.0/mod.ts" - 或者用导入映射统一管理依赖:
在项目根目录创建import_map.json:
然后两个文件都用统一路径导入:{ "imports": { "oak/": "https://deno.land/x/oak@v12.5.0/" } }
运行时加上参数加载导入映射:import { Router } from "oak/mod.ts"deno run --import-map=import_map.json server.ts
2. 禁用类型检查(无需TS类型的快速解决)
如果不想处理类型相关问题,可以直接关闭对应文件的类型校验:
- 在
routes.js文件顶部添加注释:// @ts-nocheck,这样Deno就不会对这个文件做类型检查,也就不会抛出类型不兼容的错误。 - 若要全局禁用类型检查,运行时加上
--no-check参数:deno run --no-check server.ts,但这种方式会关闭所有文件的类型提示,可能掩盖其他潜在问题,优先推荐给单个文件加// @ts-nocheck。
内容的提问来源于stack exchange,提问作者Kamafeather
相关产品推荐
相关产品推荐

