Como você produzir um .d.ts "tipagens" arquivo definição de uma biblioteca JavaScript existente?

votos
127

Eu estou usando um monte de bibliotecas tanto meu próprio e 3rd party. Eu vejo o tipagens diretório contém alguns para Jquery e WinRT ... mas como eles são criados?

Publicado 02/10/2012 em 10:29
fonte usuário
Em outras línguas...                            


8 respostas

votos
168

Existem algumas opções disponíveis para você, dependendo da biblioteca em questão, como está escrito, e qual o nível de precisão que você está procurando. Vamos analisar as opções, em ordem de conveniência cerca descendente.

Talvez Ele já existe

Sempre verifique DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) em primeiro lugar. Este é um repo comunidade cheia de literalmente milhares de arquivos .d.ts e é muito provável que a coisa que você está usando já está lá. Você também deve verificar TypeSearch ( https://microsoft.github.io/TypeSearch/ ), que é um motor de busca para arquivos .d.ts publicada-NPM; isso terá um pouco mais definições do que DefinitelyTyped. Alguns módulos também estão enviando suas próprias definições, como parte de sua distribuição NPM, assim também ver se esse for o caso antes de tentar escrever o seu próprio.

Talvez você não precisa de um

Typescript agora suporta a --allowJsbandeira e vai fazer mais inferências baseadas em JS em arquivos .js. Você pode tentar incluindo o arquivo js em sua compilação juntamente com a --allowJsconfiguração para ver se isso lhe dá uma boa informação tipo suficiente. Typescript vai reconhecer coisas como aulas ES5 de estilo e comentários JSDoc nesses arquivos, mas pode tropeçar se a biblioteca inicializa-se de uma maneira estranha.

Começar com --allowJs

Se --allowJsvocê deu bons resultados e você quer escrever apresentar uma definição melhor a si mesmo, você pode combinar --allowJscom --declarationpara ver "melhor estimativa" do original datilografado para os tipos de biblioteca. Isto lhe dará um ponto de partida razoável, e pode ser tão bom quanto um arquivo de autoria mão se os comentários JSDoc são bem escritos e o compilador foi capaz de encontrá-los.

Comece com dts-gen

Se --allowJsnão funcionar, você pode querer usar dts-gen ( https://github.com/Microsoft/dts-gen ) para obter um ponto de partida. Esta ferramenta utiliza a forma de execução do objecto para enumerar com precisão todas as propriedades disponíveis. No lado positivo este tende a ser muito precisos, mas a ferramenta ainda não suporta raspando os comentários JSDoc para preencher tipos adicionais. Você executar este assim:

npm install -g dts-gen
dts-gen -m <your-module>

Isso irá gerar your-module.d.tsna pasta atual.

Bata o botão do Snooze

Se você só quer fazer tudo mais tarde e ir sem tipos por um tempo, à máquina 2.0 agora você pode escrever

declare module "foo";

que lhe permitirá importo "foo"módulo com tipo any. Se você tiver um global, você quer lidar com mais tarde, basta escrever

declare const foo: any;

o que lhe dará uma foovariável.

Respondeu 02/10/2012 em 18:11
fonte usuário

votos
7

como descrito na http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript em 0:33:52 eles tinham construído uma ferramenta para converter WebIDL e WinRT metadados em d.ts typescript

Respondeu 02/10/2012 em 21:24
fonte usuário

votos
10

Como diz Ryan, o compilador tsc tem um interruptor --declarationque gera um .d.tsarquivo de um .tsarquivo. Observe também que (com exceção de bugs) typescript é suposto ser capaz de compilar Javascript, assim você pode passar o código javascript para o compilador tsc existente.

Respondeu 03/10/2012 em 00:02
fonte usuário

votos
2

Gostaria de olhar para um mapeamento existente de seus 3rd party bibliotecas JS que suportam Script # ou SharpKit. Os usuários desses C # para .js compiladores cruzadas vai ter enfrentado o problema que enfrentamos agora e poderia ter publicado um programa de código aberto para digitalizar seu 3rd party lib e converter em classes esqueleto C #. Se assim for cortar o programa de scanner para gerar texto datilografado no lugar de C #.

Falhando isso, traduzindo uma interface pública C # para o seu terceiro lib partido em definições typescript pode ser mais simples do que fazer o mesmo, lendo a fonte JavaScript.

Meu interesse especial é framework ExtJS RIA do Sencha e eu sei que tem havido projectos publicado para gerar uma interpretação C # para Script # ou SharpKit

Respondeu 04/10/2012 em 18:37
fonte usuário

votos
13

A melhor maneira de lidar com isso (se um arquivo de declaração não está disponível em DefinitelyTyped ) é escrever declarações apenas para as coisas que você usa ao invés de toda a biblioteca. Isso reduz o trabalho muito - e, adicionalmente, o compilador está lá para ajudar, reclamando sobre métodos faltando.

Respondeu 19/10/2015 em 09:08
fonte usuário

votos
25

Você pode usar tsc --declaration fileName.tscomo Ryan descreve, ou você pode especificar declaration: truesob compilerOptionsa sua tsconfig.jsonsupondo que você já tinha um tsconfig.jsonem seu projeto.

Respondeu 04/08/2016 em 00:54
fonte usuário

votos
2

Aqui estão algumas PowerShell que cria um único arquivo de definição do texto dactilografado uma biblioteca que inclui vários *.jsarquivos com JavaScript moderna.

Em primeiro lugar, mudar todas as extensões para .ts.

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

Em segundo lugar, use o compilador typescript para gerar arquivos de definição. Haverá um monte de erros do compilador, mas podemos ignorar aqueles.

Get-ChildItem | foreach { tsc $_.Name  }

Finalmente, combinar todos os *.d.tsarquivos em um index.d.ts, removendo as importdeclarações e removendo a defaultpartir de cada declaração de exportação.

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

Esta termina com uma única, utilizáveis index.d.tsarquivo que inclui muitas das definições.

Respondeu 19/08/2016 em 22:44
fonte usuário

votos
0

Ao criar a sua própria biblioteca, você pode pode criar *.d.tsarquivos usando o tsccomando (typescript Compiler) assim: (supondo que você está construindo sua biblioteca para a dist/libpasta)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): Gera os *.d.tsarquivos
  • --declarationDir dist/lib: Diretório de saída para arquivos de declaração gerados.
  • --declarationMap: Gera um Sourcemap para cada correspondente arquivo' .d.ts'.
  • --emitDeclarationOnly: Apenas emitem arquivos de declaração' .d.ts'. (Sem JS compilado)

(ver os documentos para todas as opções do compilador linha de comando)

Ou, por exemplo, na sua package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

e, em seguida, executar: yarn build:types(ou npm run build:types)

Respondeu 23/09/2019 em 19:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more