将 Typescript 与 JSDoc 一起使用时,如何解决 "Cannot find name 'Record'"(或其他实用程序类型)?

How do I solve "Cannot find name 'Record'" (or other utility types) when using Typescript with JSDoc?

在普通 JavaScript 中使用 JSDoc + tsserver 时是否可以使用 Utility 类型,例如 Record?

(我正在尝试创建一个设置,让我尽可能多地获得 TypeScript 的好处,而无需转译)

示例代码

我恰好需要一张地图,据我所知,它在 TypeScript 中定义为“Record”:

let http = require("http");

/**@type {Record<string, Person>} */
let people = {
  "1234": { name: "Bob" },
  "abcd": { name: "Jane" }
};

http.createServer(function (req, res) {
  res.end(JSON.stringify(people));
}).listen(process.env.PORT || 3000);

错误

但是,当我尝试使用它时出现此错误:

[tsserver] Cannot find name 'Record'. [E]

配置

版本:

tsc --version:

Version 4.3.5

tsconfig.json:

{
  "compilerOptions": {
    "incremental": true,
    "target": "ESNEXT",
    "module": "commonjs",
    "lib": ["DOM"],
    "allowJs": true,
    "checkJs": true,
    "tsBuildInfoFile": "./cache",
    "noEmit": true,
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictBindCallApply": true,
    "strictPropertyInitialization": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["**/*.js"],
  "exclude": ["node_modules"]
}

作为参考,这就是我在 .vimrc:

中设置 ale 以使用 tsserver 的方式
let g:ale_linters = {'javascript': ['tsserver', 'jshint']}

Record 类型在 lib.es5.d.ts 中定义,因此您至少需要将 es5 添加到 lib 数组中。

如果不设置lib,则默认为target,但如果设置了,则必须手动包含基本的es库(常用于有polyfill的环境,但不要'不支持新的语言功能)。