Typescript: typeRoots não está encontrando um arquivo de declaração personalizado

Criado em 28 fev. 2018  Â·  15Comentários  Â·  Fonte: microsoft/TypeScript



Versão TypeScript:
Versão 2.6.2


Termos de pesquisa:
arquivo de declaração para função de exportação de módulo, módulo externo, pacote npm, módulo de terceiros

Código
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;
}
*/

Comportamento esperado:
Compilando sem erros.

Comportamento real:
Erro ao executar 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 é um pacote NPM que estou tentando usar, que atualmente não tem declarações de tipo publicadas.

Depois de ler a seção do Manual do Typescript sobre arquivos de declaração, descobri que estou tentando escrever um arquivo de declaração para uma biblioteca modular e devo usar o modelo de arquivo de declaração module-function.d.ts . É assim que eu vim com o código em index.d.ts acima, mas o compilador ainda reclama por não ter o arquivo de declaração para o módulo 'graphql-list-fields'. Após tentativa e erro, descobrimos que adicionar declare module 'graphql-list-fields' torno de tudo funcionou sem erros do compilador.

Tentamos definir "typeRoots": ["./node_modules/@types", "./src/@types"] em tsconfig.json , conforme mencionado na documentação tsconfig, mas ainda não funcionou sem declare module 'graphql-list-fields' . Isso parece ser um problema porque tsc não está encontrando a declaração de tipo nos diretórios especificados em typeRoots.

Assuntos relacionados:
3019 , 8335

Question

Comentários muito úteis

TypeRoots é realmente um suporte que adicionamos para compatibilidade de volta com tipificações e para permitir a migração, então tentamos mantê-lo fora dos documentos o máximo possível para evitar confusão.

@mhegazy Ter um recurso compatível com pouca ou nenhuma documentação é o que causa confusão. Documente adequadamente recursos como este, mas seja liberal com sua linguagem de aviso. Por exemplo:

_ Nota: Este recurso é fornecido para compatibilidade com versões anteriores de tipificações para suportar a migração. Veja as notas de lançamento [aqui] para mais informações._

Isso seria _muito_ preferível a ter que verificar os problemas do GitHub, StackExchange, etc. para obter informações.

Todos 15 comentários

"typeRoots" destina-se a código global. ou seja, algo que é declarado no namespace global e você deseja incluí-lo. é por isso que seu declare module 'graphql-list-fields' {.. funciona, uma vez que apenas declara um módulo com aquele nome no namespace global.

Para módulos, eles têm seu próprio escopo, tudo que você precisa é mapear o caminho.

algo como:

{
    "compilerOptions": {
        "target": "es5",
        "baseUrl": "./",
        "paths": {
            "*" : ["src/@t`ypes/*"]
        }
    }
}`

Obrigado por esclarecer isso @mhegazy. Acho que seria útil se isso fosse explicado mais nos documentos do TypeScript, possivelmente na seção de arquivos de declaração .

TypeRoots é realmente um suporte que adicionamos para compatibilidade de volta com tipificações e para permitir a migração, então tentamos mantê-lo fora dos documentos o máximo possível para evitar confusão.

Não tenho certeza se isso se encaixa na seção do arquivo de declaração. temos uma observação sobre isso em https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping

Posso adicionar uma observação na seção do arquivo de declaração sobre a seção de resolução do módulo como um todo.

dê uma lida nessa seção e nos informe se ainda encontrar documentos em falta

Ah eu vejo. Sim, essa é a página que eu precisava para começar. Acho que seria bom ter pelo menos uma breve menção ao mapeamento de caminho e talvez um link para esse documento em https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html.

Fechar automaticamente este problema para fins de manutenção. Os rótulos do problema indicam que ele não pode ser acionado no momento ou já foi resolvido.

Ainda acho que seria útil ter os documentos atualizados conforme declarado em meu comentário anterior @ typescript-bot

TypeRoots é realmente um suporte que adicionamos para compatibilidade de volta com tipificações e para permitir a migração, então tentamos mantê-lo fora dos documentos o máximo possível para evitar confusão.

@mhegazy Ter um recurso compatível com pouca ou nenhuma documentação é o que causa confusão. Documente adequadamente recursos como este, mas seja liberal com sua linguagem de aviso. Por exemplo:

_ Nota: Este recurso é fornecido para compatibilidade com versões anteriores de tipificações para suportar a migração. Veja as notas de lançamento [aqui] para mais informações._

Isso seria _muito_ preferível a ter que verificar os problemas do GitHub, StackExchange, etc. para obter informações.

Muito obrigado @mhegazy ! : tada: Essa entrada de caminho para @types foi finalmente a peça que faltava que fez a configuração do meu projeto fora do padrão funcionar. Passei dias nisso.

Se você não se importar em desacelerar um pouco o processo de inicialização do aplicativo, basta adicionar TS_NODE_FILES=true ao script de início do package.json e todos os arquivos de declaração personalizados serão encontrados.

Agora estou recebendo:

The following changes are being made to your tsconfig.json file:
  - compilerOptions.paths must not be set (aliased imports are not supported)

e esta opção está sendo excluída.

@KrzysztofMadejski isso é feito pelo CRA, não pelo próprio TS.

Este tópico diz que typeroots é realmente para compatibilidade com versões anteriores. Estou tentando usá-lo para tipos de autoria definitivamente digitados. De que outra forma eu testaria adequadamente esses tipos sem tpero? Eu gerei tipos usando dts-gen e adicionei types às minhas raízes de tipo e ainda sem sorte :-(

@Roaders você encontrou a solução para usar dts-gen tipos gerados?

Editar: resolvido com https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776

Uma coisa que não entendo aqui é:

tsconfig.base.json:

"typeRoots": ["node_modules/@types", "types"],

E uma estrutura de diretório:

/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts

Ele não será coletado em meu repositório nrwl / nx. Posso tentar um milhão de coisas, mas se eu mover aquela pasta something-else para node_modules/@types ela vai funcionar magicamente e ser selecionada, o que sugere que typeRoots não faz absolutamente nada como node_modules/@types é manipulado magicamente.

Marcar typeRoots como obsoleto e dizer que funciona de uma forma estranha / peculiar teria pelo menos me impedido de tentar usá-lo.

A única maneira que consegui adicionar tipos locais sempre que preciso é passar horas lutando com meu tsconfig.base.json e tropeçar no comentário mhegazy acima

Eu sempre fui mordido por isso e esqueci de ter que configurar a opção paths também, então criei um repositório simples com as configurações adequadas. Espero que ajude alguém.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

pjmolina picture pjmolina  Â·  3Comentários

jeffreymorlan picture jeffreymorlan  Â·  3Comentários

ggmod picture ggmod  Â·  3Comentários

kwpeters picture kwpeters  Â·  3Comentários

harukaeru picture harukaeru  Â·  3Comentários