Как решить проблему «Не удается найти имя «Запись» » (или другие типы утилит) при использовании Typescript с JSDoc?

#node.js #typescript #jsdoc #tsc #tsserver

Вопрос:

Можно ли использовать типы утилит, такие как Запись, при использовании JSDoc tsserver в обычном JavaScript?

(Я пытаюсь создать настройку, которая дает мне столько преимуществ машинописи, сколько я могу выдержать, без переноса)

Пример Кода

Мне действительно нужна карта, которая, как я понимаю, определена в машинописном тексте как «Запись».:

 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"]
}
 

Для справки, вот как я настроил эль для использования tsserver в моем .vimrc :

 let g:ale_linters = {'javascript': ['tsserver', 'jshint']}
 

Комментарии:

1. что показывает IDE, когда вы просто наводите курсор Record мыши ? Я получаю полное описание того, что Record происходит в машинописном тексте.

Ответ №1:

Record тип определен в lib.es5.d.ts , поэтому вам нужно добавить, по крайней мере es5 , в свой lib массив.

Если вы не зададите lib значение по умолчанию target , но если вы его зададите , базовые библиотеки es должны быть включены вручную (обычно используются для сред с полифайлами, но не поддерживают новые языковые функции).

Комментарии:

1. Не могли бы вы привести конкретный пример того, как это выглядит? Как { lib: [«liba», «libb», «libc»] }? Или { lib: [«цель», «libc»] } Или что? И знаете ли вы, где я нахожу документацию для этого?

2. Последующие действия: прокомментируйте // «lib»: []. Установите «цель»: «es6» или «esnext» или что-то еще.