将 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的环境,但不要'不支持新的语言功能)。
在普通 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
:
tsserver
的方式
let g:ale_linters = {'javascript': ['tsserver', 'jshint']}
Record
类型在 lib.es5.d.ts
中定义,因此您至少需要将 es5
添加到 lib
数组中。
如果不设置lib
,则默认为target
,但如果设置了,则必须手动包含基本的es库(常用于有polyfill的环境,但不要'不支持新的语言功能)。