Language-tools: Типы для переопределения встроенных элементов

Созданный на 25 июн. 2020  ·  14Комментарии  ·  Источник: sveltejs/language-tools

Опишите ошибку
Если установить какой-то модуль @types/* npm, который каким-то образом переопределяет типы React, тогда проверка типов запутается. Я могу представить, почему это происходит, но было бы неплохо, если бы это можно было как-то исправить. В моем случае я использую сборник рассказов (со Svelte), но он устанавливает кучу модулей @types/* которые каким-то образом портят типы пользователей языкового сервера. Я не определил, какой из типов модулей является виновником. Но в идеале типы языковых серверов должны превосходить другие типы.

Воспроизводить
Шаги по воспроизведению поведения:

  1. Установите модуль npm @ storybook / addon-knobs
  2. Триггерные типы TS для загрузки каким-либо образом, например, путем импорта модуля
  3. Простой HTML теперь вызывает ошибки типа

Пример кода, вызывающего ошибку:

<script lang="typescript">
  import * as foo from '@storybook/addon-knobs';
</script>

<div>
  <p></p>
</div>

Ожидаемое поведение
Что HTML не вызовет ошибку.

Скриншоты
image

Система (пожалуйста, заполните следующую информацию):

  • ОС: Linux
  • IDE: VSCode
  • Плагин / Пакет: "Svelte Beta", svelte-language-server , svelte-check

Дополнительный контекст
svelte-check также вызывает те же ошибки, что и в среде IDE.

Fixed bug documentation

Все 14 Комментарий

Модуль загружает определения глобальных типов, некоторые определения типов React. Есть и другие люди, у которых есть эта проблема, кажется, пока нет хорошего решения, но существуют обходные пути
https://github.com/microsoft/TypeScript/issues/17042
https://github.com/microsoft/TypeScript/issues/18588

Есть возможное обходное решение , возможно, вы можете попробовать это сами. Мы также можем добавить этот обходной путь к репо, если это выполнимо.

Спасибо за внимание @dummdidumm. Это сработало! Для справки:

tsconfig.json :

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "react": ["sink.d.ts"]
    }
  }
}

sink.d.ts :

declare module 'react';

Это что-то, что можно добавить на сам языковой сервер, или это испортит ситуацию для пользователя, который действительно хотел использовать типы React в своем проекте?

Я так не думаю. Даже если он это делает, языковой сервер работает только с небольшими файлами, поэтому, если он находится в файле tsx / jsx, все должно работать. Я кое-что добавлю.

Вы можете проверить это на ночной сборке .

Он уже включен в ночную сборку? К сожалению, это не работает. Однако я думаю, что baseUrl требуется, если paths также настроен в tsconfig.json https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -картинг. Я могу попробовать добавить baseUrl в свою локальную среду, чтобы проверить, будет ли это работать.

Да ладно. Похоже, что изменения в ночную сборку еще не внесены. Завтра еще раз протестирую.

Спасибо, что указали на это, произошла ошибка в конвейере развертывания (порядок был нарушен, поэтому расширение было построено с использованием пакетов npm накануне).

Извините за медленный ответ @dummdidumm. Я протестировал исправление, и, к сожалению, оно не работает, но я поигрался и нашел необходимые исправления:

  1. Здесь должно быть configJson.compilerOptions.paths вместо configJson.paths . Небольшой баг :)
    https://github.com/sveltejs/language-tools/blob/9b936fca70c03f86474aec40773c29a9b38805c2/packages/language-server/src/plugins/typescript/service.ts#L189 -L190

  2. Это не работает без опции configJson.compilerOptions.baseUrl . Это немного сложнее исправить. Во-первых, нам нужно проверить, установлен ли он уже, и если нет, то, конечно, удачный путь - configJson.compilerOptions.baseUrl = '.' . Однако, если он установлен, мы должны разрешить наш путь относительно того, что пользователь установил в качестве своего базового URL-адреса. Это немного усложняет ситуацию, но я уверен, что есть способ это спроектировать. У меня нет времени заглядывать в банкомат, но я хотел обратить на это ваше внимание.

Я не уверен в необходимости baseUrl , потому что устанавливаемые типы имеют абсолютный путь. Я думаю, что служба TS это чтит.

Благодарим за указание на ошибку compilerOptions 😃 Исправление, которое устранило проблему ввода.

Примечание по поводу svelte-check : если эта ошибка по-прежнему возникает завтра, но больше не в среде IDE, попробуйте удалить и переустановить svelte-check , транзитивная зависимость svelte-language-server может не обновиться до Последняя версия.

Спасибо за продолжение @dummdidumm! Я протестировал его еще раз и могу точно подтвердить, что исправление не работает, если compilerOptions.baseUrl не задано: grinning: Однако хорошая новость заключается в том, что если пользователь установил некоторый baseUrl , это не влияет на разрешение переопределения реакции, поскольку это абсолютный путь. Я ошибался, думая, что нам понадобится взлом, чтобы заставить его работать.

Если вы протестировали текущее решение и заставили его работать, убедитесь, что compilerOptions.baseUrl настроено в tsconfig.json вашей тестовой среды;)

Добавлены документы. Я оставлю это пока открытым, чтобы его было легче обнаружить, если кто-то обнаружит ошибку, но не прочитает раздел об устранении неполадок.

Отличная новость, это было исправлено как побочный эффект # 351, после следующего производственного выпуска обходной путь со стоками больше не нужен.

Чудесно! Спасибо за предупреждение! : тада:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги