javascript 只有在导入变量时,Typescript才抱怨类型

t2a7ltrp  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(88)

我运行一个简单的HTTP服务器,通过Deno,在Supabase托管。
当我在外部文件中移动路由定义时,TypeScript启动并开始抱怨参数类型。

    • 注意:**我没有在我的代码中使用TS,我正在使用vanilla JS。

What was working

这是server.ts

import { Application, Router } from "https://deno.land/x/oak@v11.1.0/mod.ts";

const router = new Router()

const app = new Application();
app.use(router.routes());
await app.listen({ port: 4000 });

如果我只是在另一个模块中提取Router示例,那么Typescript就会开始抱怨无效的类型。

是什么打破了它

创建一个routes.js

import { Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();

export default router;

并在server.ts中使用它:

import { Application } from "https://deno.land/x/oak@v11.1.0/mod.ts";
import router from "./routes.js";

const app = new Application();
app.use(router.routes()); // <--- THIS THROWS ERROR
await app.listen({ port: 4000 });

use()突然抱怨传入的参数类型不正确:
错误:TS2345 [ERROR]:“import(“www.example.com”)类型的参数。Middleware <Record <string,any>,import(“www.example.com”)。Context <Record <string,any>,Record <string,any>>>”不可分配给“import(“www.example.com”)类型的参数。Middleware <Record <string,any>,import(“www.example.com”)。Context <Record <string,any>,Record <string,any>>>”。https://deno.land/x/oak@v12.5.0/middleware.ts类型'import("https://deno.land/x/oak@v11.1.0/context.ts"). Context <Record <string,any>,Record <string,any>>'不可分配给类型'import("www.example.com"). Context <Record <string,any>,Record <string,any>>'。https://deno.land/x/oak@v12.5.0/context.tsapp.use(router. routes()); https://deno.land/x/oak@v11.1.0/middleware.ts ").Middleware<Record<string, any>, import("https://deno.land/x/oak@v11.1.0/context.ts ").Context<Record<string, any>, Record<string, any>>>'. Types of parameters 'context' and 'context' are incompatible. Type 'import("https://deno.land/x/oak@v11.1.0/context.ts").Context<Record<string, any>, Record<string, any>>' is not assignable to type 'import("https://deno.land/x/oak@v12.5.0/context.ts ").Context<Record<string, any>, Record<string, any>>'. Property '#wrapReviverReplacer' in type 'Context' refers to a different member that cannot be accessed from within type 'Context'. app.use(router.routes());

  • 为什么router.routes()突然变成了错误的类型,而我只是简单地将它从当前文件中移出?*

这对我来说毫无意义。
我如何防止这种情况发生?我不想在任何地方都使用类型。
这段代码运行得很好,没有在Typescript的土地上结束。

wecizke3

wecizke31#

我想明白了
更好地阅读大量和不可读的错误消息,我注意到提到了2个不同的oak版本:v12.5.0v11.1.0
之所以会出现这种不对齐,是因为VSCode建议通过从导入URL重定向来“快速修复”导入的版本。我在编写代码时不知何故得到了不同的版本。
解决方法是:

  • 使用通用的https://deno.land/x/oak/mod.ts(但是当获取latest版本时,它会被破坏;需要deno vendor lock
  • 或者选择上面提到的显式semversions之一,并在代码中始终使用它。(更好的解决方案,特别是对于进入生产环境并且不应该中断的代码)

相关问题