Опишите ошибку
Если установить какой-то модуль @types/*
npm, который каким-то образом переопределяет типы React, тогда проверка типов запутается. Я могу представить, почему это происходит, но было бы неплохо, если бы это можно было как-то исправить. В моем случае я использую сборник рассказов (со Svelte), но он устанавливает кучу модулей @types/*
которые каким-то образом портят типы пользователей языкового сервера. Я не определил, какой из типов модулей является виновником. Но в идеале типы языковых серверов должны превосходить другие типы.
Воспроизводить
Шаги по воспроизведению поведения:
Пример кода, вызывающего ошибку:
<script lang="typescript">
import * as foo from '@storybook/addon-knobs';
</script>
<div>
<p></p>
</div>
Ожидаемое поведение
Что HTML не вызовет ошибку.
Скриншоты
Система (пожалуйста, заполните следующую информацию):
svelte-language-server
, svelte-check
Дополнительный контекст
svelte-check
также вызывает те же ошибки, что и в среде IDE.
Модуль загружает определения глобальных типов, некоторые определения типов 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. Я протестировал исправление, и, к сожалению, оно не работает, но я поигрался и нашел необходимые исправления:
Здесь должно быть configJson.compilerOptions.paths
вместо configJson.paths
. Небольшой баг :)
https://github.com/sveltejs/language-tools/blob/9b936fca70c03f86474aec40773c29a9b38805c2/packages/language-server/src/plugins/typescript/service.ts#L189 -L190
Это не работает без опции 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, после следующего производственного выпуска обходной путь со стоками больше не нужен.
Чудесно! Спасибо за предупреждение! : тада: