Версия TypeScript:
Версия 2.6.2
Условия поиска:
файл декларации для функции экспорта модуля, внешнего модуля, пакета npm, стороннего модуля
Код
src/testFile.ts
:
import getFieldList = require('graphql-list-fields');
src/@types/graphql-list-fields/index.d.ts
:
// Doing just this below (as suggested by the Typescript Handbook does not work
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
import { GraphQLResolveInfo } from 'graphql';
function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
}
*/
Ожидаемое поведение:
Компиляция без ошибок.
Фактическое поведение:
Ошибка при запуске tsc
:
src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`
graphql-list-fields
- это пакет NPM, который я пытаюсь использовать, в котором в настоящее время нет опубликованных объявлений типов.
Прочитав раздел Руководства по Typescript, посвященный файлам объявлений, я обнаружил, что пытаюсь написать файл объявлений для модульной библиотеки и должен использовать шаблон файла объявления module-function.d.ts . Вот как я придумал код в index.d.ts
выше, но компилятор по-прежнему жалуется на отсутствие файла объявления для модуля 'graphql-list-fields'. После проб и ошибок мы обнаружили, что добавление declare module 'graphql-list-fields'
вокруг всего работает без ошибок компилятора.
Мы попытались установить "typeRoots": ["./node_modules/@types", "./src/@types"]
в tsconfig.json
, как упоминалось в документации tsconfig, но это все равно не работало без declare module 'graphql-list-fields'
. Это кажется проблемой, потому что tsc не находит объявление типа в каталогах, указанных в typeRoots.
"typeRoots"
предназначен для глобального кода. т.е. что-то, что объявлено в глобальном пространстве имен, и вы хотите его включить. вот почему ваш declare module 'graphql-list-fields' {..
работает, поскольку он просто объявляет модуль с таким именем в глобальном пространстве имен.
Для модулей у них есть своя собственная область видимости, все, что вам нужно, это отображение пути.
что-то вроде:
{
"compilerOptions": {
"target": "es5",
"baseUrl": "./",
"paths": {
"*" : ["src/@t`ypes/*"]
}
}
}`
Спасибо за разъяснение @mhegazy. Я думаю, было бы полезно, если бы это было объяснено более подробно в документации TypeScript, возможно, в разделе файлов объявлений .
TypeRoots - это действительно поддержка, которую мы добавили для обратной совместимости с убрать ее из документации, чтобы избежать путаницы.
Не уверен, подходит ли это к разделу файла декларации. у нас есть примечание об этом в https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping
Я могу добавить примечание в раздел файла декларации о разделе разрешения модуля в целом.
прочтите этот раздел и сообщите нам, если вы по-прежнему обнаружите, что в нем отсутствуют документы
О, я вижу. Да, это та страница, с которой мне нужно было начать. Я думаю, было бы неплохо иметь хотя бы краткое упоминание о сопоставлении путей и, возможно, ссылку на этот документ где-нибудь под https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html.
Автоматически закрывать этот выпуск для служебных целей. Ярлыки проблемы указывают на то, что в данный момент она не требует действий или уже решена.
Я все еще думаю, что было бы полезно обновить документы, как указано в моем предыдущем комментарии @ typescript-bot
TypeRoots - это действительно поддержка, которую мы добавили для обратной совместимости с убрать ее из документации, чтобы избежать путаницы.
@mhegazy Наличие поддерживаемой функции без документации - вот что вызывает путаницу. Пожалуйста, правильно задокументируйте подобные функции, но будьте либеральны в своих предупреждениях. Например:
_ Примечание. Эта функция предназначена для обратной совместимости с типами для поддержки миграции. См. Примечания к выпуску [здесь] для получения дополнительной информации._
Это было бы _ очень_ предпочтительнее, чем сканировать проблемы GitHub, StackExchange и т. Д. Для получения информации.
Спасибо, черт возьми, @types
была, наконец, недостающей частью, которая заставила мою нестандартную настройку проекта работать. Я потратил на это несколько дней.
Если вы не против немного замедлить процесс запуска вашего приложения, вы можете просто добавить TS_NODE_FILES=true
в сценарий запуска вашего package.json, и будут найдены все файлы пользовательских объявлений.
Я получаю:
The following changes are being made to your tsconfig.json file:
- compilerOptions.paths must not be set (aliased imports are not supported)
и эта опция удаляется.
@KrzysztofMadejski , это сделано CRA, а не самой TS.
В этой ветке говорится, что typeroots действительно для обратной совместимости. Я пытаюсь использовать его для создания типов для окончательно типизированных. Как еще я мог бы правильно протестировать эти типы без typeroot? Я сгенерировал типы с помощью dts-gen
и добавил types
к своим корням типов, но все равно не повезло :-(
@Roaders вы нашли решение использовать сгенерированные типы dts-gen
?
Изменить: решено с помощью https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776
Я не понимаю одного:
tsconfig.base.json:
"typeRoots": ["node_modules/@types", "types"],
И структура каталогов:
/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts
Его вообще не заберут в моем репозитории nrwl / nx. Я могу попробовать миллион вещей, но если я перенесу эту папку something-else
в node_modules/@types
она волшебным образом сработает и будет поднята, что предполагает, что typeRoots
абсолютно ничего не делает, как node_modules/@types
обрабатывается волшебным образом.
Пометка typeRoots как устаревшего и указание, что он работает странным / причудливым образом, по крайней мере остановило бы меня, пытаясь его использовать.
Единственный способ, которым мне удавалось добавлять локальные типы каждый раз, когда мне было нужно, - часами бороться с моим tsconfig.base.json и наткнуться на комментарий mhegazy выше
Меня все это укусило, и я забыл о необходимости настраивать параметр paths
, поэтому я создал простой репозиторий с правильными настройками. Надеюсь, это кому-то поможет.
Самый полезный комментарий
@mhegazy Наличие поддерживаемой функции без документации - вот что вызывает путаницу. Пожалуйста, правильно задокументируйте подобные функции, но будьте либеральны в своих предупреждениях. Например:
Это было бы _ очень_ предпочтительнее, чем сканировать проблемы GitHub, StackExchange и т. Д. Для получения информации.