Машинописный текст/Intellisesnse (неправильно?) выбор переменной из другого файла (lib.dom.d.ts)

#javascript #typescript #visual-studio-code #intellisense

Вопрос:

Сегодня я ссылался на неназванную/неопределенную переменную, но Typescript/Intellisense не уловил ее, что привело к ошибке в моем коде. Имя переменной — «статус», и Intellisense взял определение из файла /usr/share/code/resources/app/extensions/node_modules/typescript/lib/lib.dom.d.ts . (Я использую Linux Ubuntu 20.04)

Более подробная информация:

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

безымянная переменная «статус» не создает ошибок

Нажав «Найти все ссылки», я обнаружил, что «статус» был объявлен в случайном файле lib.dom.d.ts

«статус» был объявлен в случайном файле lib.dom.d.ts

Похоже, это произошло потому, что я устанавливаю Typescript по всему миру? Я также установил Typescript в проекте; обе установки обновлены до версии «typescript@4.3.4»

Я также проверил, является ли это только ошибкой, специфичной для VSCode, но LSP-машинопись Sublime Text также получила такое же неправильное определение.

Как мне решить эту проблему ?

Мой файл tsconfig.json выглядит следующим образом

 {
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "removeComments": true,
    "strict": true,
    "noImplicitAny": false,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "exlude": ["node_modules"]
}
 

Ответ №1:

Определение типа правильное.

Он определяется window.status (хотя и устарел), поэтому status его следует считать глобальным в контексте браузера.

Вчера я столкнулся с той же проблемой с close / window.close .

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

1. Вау, спасибо за ответ. Я надеюсь, что в документе Typescript есть еще один раздел для путаницы имен переменных, подобных этому. Итак, как мне указать Typescript не включать контекст браузера в мои файлы API ?

2. Хорошо, я нашел способ. Смотрите мой ответ ниже.

Ответ №2:

Благодаря ответу @spender я понял, что это ожидаемое поведение Typescript, и это я ошибся.

Я решил проблему, добавив опцию «lib» в свой файл tsconfig.json. Похоже, что если я исключу опцию «библиотека», Typescript по умолчанию будет включать все библиотеки. Но я не хочу, чтобы библиотека «dom» вмешивалась в мой внутренний код, поэтому я использую: "lib": ["es2015"]

Если я когда-нибудь буду использовать библиотеку «dom» в будущем, я думаю, мне просто придется быть особенно осторожным