Infelizmente, essas coisas não estão muito bem documentadas no momento, mas mesmo que você conseguisse fazer funcionar, vamos revisar sua configuração para que você entenda o que cada parte está fazendo e como ela se relaciona com o modo como o texto datilografado processa e carrega as digitações.
Primeiro, vamos revisar o erro que você está recebendo:
error TS2688: Cannot find type definition file for 'lodash'.
Na verdade, esse erro não é proveniente de suas importações ou referências ou de sua tentativa de usar o lodash em qualquer lugar de seus arquivos ts. Em vez disso, vem de um mal-entendido sobre como usar as propriedades typeRoots
e types
, então vamos entrar em mais detalhes sobre elas.
O problema com as propriedades typeRoots:[]
e types:[]
é que NÃO são formas de uso geral para carregar *.d.ts
arquivos de declaração arbitrária ( ).
Essas duas propriedades estão diretamente relacionadas ao novo recurso TS 2.0, que permite empacotar e carregar declarações de digitação de pacotes NPM .
É muito importante entender que funcionam apenas com pastas no formato NPM (ou seja, uma pasta que contém um package.json ou index.d.ts ).
O padrão para typeRoots
é:
{
"typeRoots" : ["node_modules/@types"]
}
Por padrão, isso significa que o typescript irá para a node_modules/@types
pasta e tentará carregar todas as subpastas que encontrar lá como um pacote npm .
É importante entender que isso falhará se uma pasta não tiver uma estrutura semelhante a um pacote npm.
Isso é o que está acontecendo no seu caso e a fonte do seu erro inicial.
Você alterou typeRoot para ser:
{
"typeRoots" : ["./typings"]
}
Isto significa que typescript agora irá verificar o ./typings
pasta para as subpastas texto digitado e tentará carregar cada subpasta que encontrar como um módulo npm.
Então, vamos fingir que você acabou de typeRoots
definir uma configuração para apontar, ./typings
mas ainda não tem nenhuma types:[]
configuração de propriedade. Você provavelmente verá estes erros:
error TS2688: Cannot find type definition file for 'custom'.
error TS2688: Cannot find type definition file for 'global'.
Isso ocorre porque tsc
está examinando sua ./typings
pasta e encontrando as subpastas custom
e global
. Em seguida, ele está tentando interpretar isso como digitação do tipo pacote npm, mas não há nenhuma index.d.ts
ou package.json
nessas pastas e, portanto, você obtém o erro.
Agora vamos falar um pouco sobre a types: ['lodash']
propriedade que você está definindo. O que isso faz? Por padrão, o typescript carregará todas as subpastas que encontrar em seu typeRoots
. Se você especificar umtypes:
propriedade, ela carregará apenas essas subpastas específicas.
No seu caso, você está dizendo para carregar a ./typings/lodash
pasta, mas ela não existe. É por isso que você obtém:
error TS2688: Cannot find type definition file for 'lodash'
Então, vamos resumir o que aprendemos. Typecript 2.0 introduzido typeRoots
e types
para carregar arquivos de declaração empacotados em pacotes npm . Se você tiver tipificações personalizadas ou d.ts
arquivos soltos únicos que não estão contidos em uma pasta seguindo as convenções do pacote npm, então essas duas novas propriedades não são o que você deseja usar. O Typescript 2.0 realmente não muda como eles seriam consumidos. Você só precisa incluir esses arquivos em seu contexto de compilação de uma das muitas maneiras padrão:
Incluindo-o diretamente em um .ts
arquivo:
///<reference path="../typings/custom/lodash.d.ts" />
Inclusive ./typings/custom/lodash.d.ts
em sua files: []
propriedade.
Incluindo ./typings/index.d.ts
em sua files: []
propriedade (que então inclui recursivamente as outras tipificações.
Adicionando ./typings/**
ao seuincludes:
Esperançosamente, com base nesta discussão, você será capaz de dizer por que as mudanças que você tsconfig.json
fez com que as coisas funcionassem novamente.
EDITAR:
Uma coisa que esqueci de mencionar é que as propriedades typeRoots
e types
são realmente úteis apenas para o carregamento automático de declarações globais.
Por exemplo se você
npm install @types/jquery
E você está usando o tsconfig padrão, então esse pacote de tipos jquery será carregado automaticamente e $
estará disponível em todos os seus scripts sem ter que fazer mais nada ///<reference/>
ouimport
A typeRoots:[]
propriedade destina-se a adicionar locais adicionais de onde os pacotes de tipo serão carregados automaticamente.
O types:[]
principal caso de uso da propriedade é desabilitar o comportamento de carregamento automático (definindo-o como uma matriz vazia) e, em seguida, listar apenas os tipos específicos que você deseja incluir globalmente.
A outra maneira de carregar pacotes de vários tipos typeRoots
é usar a nova ///<reference types="jquery" />
diretiva. Observe o em types
vez de path
. Novamente, isso só é útil para arquivos de declaração global, normalmente aqueles que não o fazem import/export
.
Agora, aqui está uma das coisas que causa confusão com typeRoots
. Lembre-se, eu disse que typeRoots
é sobre a inclusão global de módulos. Mas @types/folder
também está envolvido na resolução de módulo padrão (independentemente de sua typeRoots
configuração).
Especificamente, os módulos explicitamente importadores sempre ignora todos includes
, excludes
, files
, typeRoots
e types
opções. Então, quando você faz:
import {MyType} from 'my-module';
Todas as propriedades mencionadas acima são completamente ignoradas. As propriedades relevantes durante resolução módulo são baseUrl
, paths
e moduleResolution
.
Basicamente, ao usar node
resolução módulo, ele vai começar a procurar por um nome de arquivo my-module.ts
, my-module.tsx
, my-module.d.ts
começando na pasta apontada pela sua baseUrl
configuração.
Se não encontrar o arquivo, ele irá procurar por uma pasta chamada my-module
e então procurar por um package.json
com uma typings
propriedade, se houver package.json
ou nenhuma typings
propriedade dentro informando qual arquivo carregar, irá então procurar index.ts/tsx/d.ts
dentro dessa pasta.
Se ainda assim não for bem-sucedido, ele pesquisará essas mesmas coisas na node_modules
pasta, começando em seu baseUrl/node_modules
.
Além disso, se ele não encontrar esses baseUrl/node_modules/@types
itens , ele pesquisará as mesmas coisas.
Se ainda não encontrou nada, ele vai começar a ir para o diretório pai e pesquisar node_modules
e node_modules/@types
lá. Ele continuará subindo nos diretórios até atingir a raiz do seu sistema de arquivos (até mesmo obtendo módulos de nó fora do seu projeto).
Uma coisa que quero enfatizar é que a resolução do módulo ignora completamente qualquer typeRoots
configuração definida. Portanto, se você configurou typeRoots: ["./my-types"]
, isso não será pesquisado durante a resolução explícita do módulo. Ele serve apenas como uma pasta onde você pode colocar os arquivos de definição global que deseja disponibilizar para todo o aplicativo, sem precisar importar ou fazer referência.
Por último, você pode substituir o comportamento do módulo com mapeamentos de caminho (ou seja, a paths
propriedade). Então, por exemplo, mencionei que nenhum costume typeRoots
não é consultado ao tentar resolver um módulo. Mas se você gostou, pode fazer esse comportamento acontecer da seguinte maneira:
"paths" :{
"*": ["my-custom-types/*", "*"]
}
O que isso faz é para todas as importações que correspondem ao lado esquerdo, tente modificar a importação como no lado direito antes de tentar incluí-la (o *
no lado direito representa sua string de importação inicial. Por exemplo, se você importar:
import {MyType} from 'my-types';
Ele tentaria primeiro a importação como se você tivesse escrito:
import {MyType} from 'my-custom-types/my-types'
E então, se não encontrasse, tentaria novamente sem o prefixo (o segundo item do array é apenas o *
que significa a importação inicial.
Dessa forma, você pode adicionar pastas adicionais para pesquisar arquivos de declaração personalizados ou mesmo .ts
módulos personalizados que deseja import
.
Você também pode criar mapeamentos personalizados para módulos específicos:
"paths" :{
"*": ["my-types", "some/custom/folder/location/my-awesome-types-file"]
}
Isso deixaria você fazer
import {MyType} from 'my-types';
Mas então leia esses tipos de some/custom/folder/location/my-awesome-types-file.d.ts
paths
e como é diferenteinclude
para fins de digitação?