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.
"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.
Comentários muito úteis
@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:
Isso seria _muito_ preferível a ter que verificar os problemas do GitHub, StackExchange, etc. para obter informações.