Typescript: typeRoots не находит файл пользовательской декларации

Созданный на 28 февр. 2018  ·  15Комментарии  ·  Источник: microsoft/TypeScript



Версия 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.

Связанные вопросы:
3019 , 8335

Question

Самый полезный комментарий

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

@mhegazy Наличие поддерживаемой функции без документации - вот что вызывает путаницу. Пожалуйста, правильно задокументируйте подобные функции, но будьте либеральны в своих предупреждениях. Например:

_ Примечание. Эта функция предназначена для обратной совместимости с типами для поддержки миграции. См. Примечания к выпуску [здесь] для получения дополнительной информации._

Это было бы _ очень_ предпочтительнее, чем сканировать проблемы GitHub, StackExchange и т. Д. Для получения информации.

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

"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 , поэтому я создал простой репозиторий с правильными настройками. Надеюсь, это кому-то поможет.

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