14

我正在检查 Deno,发现其中一个入门示例非常优雅:

import { serve } from "https://deno.land/x/std@v0.2.10/http/server.ts";
const s = serve("0.0.0.0:8000");

void async function main() {
  for await (const req of s) {
     req.respond({ body: new TextEncoder().encode("Hello World\n") });
  }
}()

我正在使用 VS Code 编写 Deno 脚本,但我不确定如何让编辑器知道导入函数的类型,例如serve. 我认为 Deno 支持 IDE 可能为时过早,但如果有解决方案或变通方法,我想知道它。

我需要安装一个@types包或类似的东西吗?importreference一些.d.ts声明文件?serve在使用此示例中的函数以及一般在 Deno 中导入的任何脚本时,如何使 VS Code 提供代码完成建议和显示类型注释?

4

2 回答 2

17

tldr

安装denoland.vscode-deno扩展1。然后在特定项目中启用Deno,例如

<proj-root>/.vscode/settings.json
{
  "deno.enable": true, // enables extension
  "deno.lint": true, // inline deno lint diagnostics, requires `deno.unstable`
  "deno.unstable": true // also provides unstable type declarations in VS Code
}

v2.3.0开始,您还可以使用deno: Init向导2在此处输入图像描述

要集成 TS 工作区版本而不是 VS Code 内置版本,请查看链接文档

1 这个已弃用。
2 注意:在一个新的空项目中,至少需要存在一个源文件,向导才能正常工作。


更多细节

扩展有什么作用?

  • 允许.ts在 VS Code 中显式扩展
  • 解析 URL 导入说明符,例如"https://deno.land/std@0.56.0/http/server.ts"
  • 集成 Deno 运行时类型(例如Deno.writeFile

如何解析.ts模块的类型

通过上述扩展,VS Code 允许.ts文件扩展名用于导入并将 URL 导入解析到本地磁盘缓存。编译器可以使用这些缓存的类型定义进行检查。最后,获取所有源并重新启动 TS 服务器/重新加载 VS 代码:

deno cache https://deno.land/std/http/server.ts # fetch and compile from URL 
# or main project file
deno cache <your main file>.ts # fetches all its dependencies

server.ts标准库的一部分,它只是一个更严格维护的远程.ts模块集合,因此它也将被正确键入。

如何解析.js模块的类型

Deno 提供了其他方法来引用.d.ts文件的.js文件。

在导入代码位置指定类型定义:
// @deno-types="./foo.d.ts"
import * as foo from "./foo.js";
在主机代码位置指定类型定义:
/// <reference types="./foo.d.ts" />
export const foo = "foo";

替代方案:Deno 可以X-TypeScript-Types从远程导入中读取自定义 HTTP 标头。

如何使用自定义tsconfig.json

项目中的给定tsconfig.json文件与 Deno 默认配置合并,例如:
{
  "compilerOptions": {
    // set a custom, deviant value
    "noImplicitAny": false // deno default is true
    // (this is just an example - use strong types, whenever possible)
  }
}
Include-c选项,因此 VS Code 和 Deno CLI 具有相同的编译器设置:
deno run -c ./tsconfig.json main.ts 

如何使用--unstable类型

最简单的选项是在 VS Code 中设置"deno.unstable": true( PR )settings.json并重新启动,请参阅tldr章节。

手动替代

cd <your-project>
deno types --unstable > deno.runtime.d.ts
touch tsconfig.json # (1); jsconfig.json for JS projects also possible

VS Code自动包含 deno.runtime.d.ts一个存在的tsconfig.json(1)。


重大变化

vscode-denov1.26.0

扩展需要由项目的in显式启用(默认为)。以前,默认值为."deno.enable": true.vscode/settings.jsonfalsetrue

vscode-deno< 1.25.0

在每种情况下(稳定和不稳定)安装 Deno 类型 - 请参阅"How to use --unstable types".

于 2020-05-30T11:12:54.617 回答
4

更新:vscode-deno运行良好。

以下是当前的解决方案:

  1. https://github.com/kitsonk/deno_ls_plugin添加到您的工作区。使用远程依赖项的本地缓存位置(通常在and下)编辑tsconfig.json并替换路径http和导入https$HOME/.deno/deps/http$HOME/.deno/deps/https
  2. 创建一个typings/文件夹。运行deno --types > typings/deno.d.ts。Deno 会为核心 API 输出一个类型定义文件。
  3. 现在问题变成了 VS Code 在导入时不知道如何获取远程依赖项。为了解决这个问题,一旦你添加了一个新的远程import,运行deno --prefetch your_file.ts拉下所有的依赖。为了让事情变得更简单,我建议将所有远程依赖项保存在一个文件中deps.ts(并--prefetch在此文件上运行)并重新导出内容,以便项目中的其他文件可以使用 deps。
于 2019-02-20T21:14:00.640 回答