Varolan bir JavaScript kitaplığından bir .d.ts “typings” tanım dosyasını nasıl üretiyorsunuz?


193

Hem kendi hem de 3. partimde çok sayıda kütüphane kullanıyorum. "Daktilolar" dizini Jquery ve WinRT için bazı içerdiğini görüyorum ... ama nasıl oluşturulur?

Yanıtlar:


232

Söz konusu kütüphaneye, nasıl yazıldığına ve aradığınız doğruluk seviyesine bağlı olarak, kullanabileceğiniz birkaç seçenek vardır. Seçenekleri, kabaca azalan bir arzu edilebilirlik sırasıyla gözden geçirelim.

Belki Zaten Var

Her zaman önce DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) öğesini kontrol edin . Bu, kelimenin tam anlamıyla binlerce .d.ts dosyasıyla dolu bir topluluk deposudur ve kullandığınız şey zaten oradadır. NPM tarafından yayınlanan .d.ts dosyaları için bir arama motoru olan TypeSearch'ü ( https://microsoft.github.io/TypeSearch/ ) kontrol etmelisiniz ; bunun DefinitelyTyped'den biraz daha fazla tanımı olacaktır. Birkaç modül de NPM dağıtımlarının bir parçası olarak kendi tanımlarını gönderiyor, bu yüzden kendi kodunuzu yazmaya çalışmadan önce durumun bu olup olmadığını görün.

Belki birine ihtiyacın yok

TypeScript artık --allowJsbayrağı destekliyor ve .js dosyalarında daha fazla JS tabanlı çıkarımlar yapacak. Size --allowJsyeterince iyi tür bilgisi verip vermediğini görmek için ayarla birlikte derlemenize .js dosyasını dahil etmeyi deneyebilirsiniz . TypeScript, ES5 tarzı sınıflar ve JSDoc yorumları gibi şeyleri bu dosyalarda tanıyacaktır, ancak kütüphane kendisini garip bir şekilde başlatırsa devreye girebilir.

Kullanmaya Başlayın --allowJs

Eğer --allowJssize iyi sonuçlar verdi ve kendinizi, sen birleştirebilirsiniz daha iyi bir tanım dosyası yazmak istiyorum --allowJsile --declarationkütüphanenin türlerine typescript en "en iyi tahmin" görmeyi. Bu size iyi bir başlangıç ​​noktası verecektir ve JSDoc yorumları iyi yazılmışsa ve derleyici bunları bulabildiyse, elle yazılmış bir dosya kadar iyi olabilir.

Dts-gen ile Başlayın

Eğer --allowJsişe yaramadıysa, bir başlangıç ​​noktası almak için dts-gen ( https://github.com/Microsoft/dts-gen ) kullanmak isteyebilirsiniz . Bu araç, kullanılabilir tüm özellikleri doğru bir şekilde numaralandırmak için nesnenin çalışma zamanı şeklini kullanır. Artı tarafta bu çok doğru olma eğilimindedir, ancak araç henüz ek türleri doldurmak için JSDoc yorumlarını kazıma işlemini desteklemez. Bu şekilde çalıştırın:

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

Bu your-module.d.ts, geçerli klasörde oluşturulur .

Erteleme düğmesine bas

Hepsini daha sonra yapmak ve bir süre yazım yapmak istemiyorsanız, TypeScript 2.0'da artık yazabilirsiniz.

declare module "foo";

hangi izin vereceğim türüyle modülü . Daha sonra uğraşmak istediğiniz bir globaliniz varsa,import"foo"any

declare const foo: any;

ki bu size bir foodeğişken verecektir .


25
Ah ... bu birçok durumda giriş için önemli bir engel olacak. Tür çıkarımına dayanarak en azından "en iyi tahminler" çıkarabilecek bir araca sahip olmak güzel olurdu. Bunlar en uygun olmasa da, en azından zaman içinde ayarlanabilirler.
Hotrodmonkey

7
+1 - Diğer iyi haberler: --declarationshem .jsdosyayı hem de dosyayı oluşturur .d.ts, yani yalnızca tek bir derleme çalıştırmanız gerekir.
Fenton

67
Popüler kütüphaneler için yüksek kaliteli tanımların bir koleksiyonunu github.com/borisyankov/DefinitelyTyped
Boris Yankov

10
'En iyi tahmin' aracı, TypeScript'te zaten bulunan IntelliSense'ten daha iyi olmayacaktır. Tür tanımlarının yararı derleyiciye 'tahmin edebileceğinden' daha fazla bilgi vermektir.
Boris Yankov

12
--allowJsile --declarationseçenekleri birleştirilemez (typescript 1.8 ve 2.0 test). error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Alexey

53

Ya kullanabilirsiniz tsc --declaration fileName.tsRyan açıklanır gibi, ya da belirtebilirsiniz declaration: truealtında compilerOptionssenin içinde tsconfig.jsonzaten bir yaşadım varsayarak tsconfig.jsonprojeniz altında.


4
Paylaşmak istediğiniz bir Açısal 2 modülü geliştiriyorsanız, bu en iyi yanıttır.
Darcy

Ben denemek için bir bildirim dosyası oluşturmak için çalışıyorum türleri tsc --declaration test.tsiçin hata alıyorum Cannot find name...:) Yani onları bildirmek önce türleri gerekir?
Kokodoko

2
@Kokodoko, eklentiyi deneyebilirsiniz declaration: truesizin için tsconfig.jsondosyanın?
JayKan

Teşekkürler, sadece * .ts'den * .d.ts oluşturmak istiyordum.
vintproykt

16

Bununla başa çıkmanın en iyi yolu ( DefinitelyTyped'de bir bildirim dosyası yoksa ), tüm kütüphane yerine yalnızca kullandığınız şeyler için bildirimler yazmaktır. Bu işi çok azaltır - ve ayrıca derleyici eksik yöntemler hakkında şikayet ederek yardım etmek için oradadır.


15

Ryan'ın dediği gibi, tsc derleyicisinin --declarationbir .d.tsdosyadan dosya üreten bir anahtarı vardır .ts. Ayrıca (engelleme hataları) TypeScript'in Javascript'i derleyebileceğini, böylece mevcut javascript kodunu tsc derleyicisine aktarabileceğinizi unutmayın.


1
şu anda görünüyor * .js dosyaları tsc içine bir hata "angular-resource.js" dosyasını okuma hatası: Dosya bulunamadı "oluşturur. Bu nedenle, tsc'yi kullanabilmek için * .js dosyalarını * .ts olarak açıkça yeniden adlandırmanız gerekir. Daha fazla ayrıntı için bu konuya bakın - Bunu angularjs'de kullanmayı denedim: typescript.codeplex.com/workitem/26
James Strachan

3
söyleyebileceğim kadarıyla, tsc geçerli herhangi bir JavaScript'i derleyebilir, ancak geçerli bir TypeScript (derleme uyarı verir) değilse --declarations bayrağı bir .d.ts dosyası vermez, bu nedenle kitaplığınız TypeScript'e yazılmadığı sürece yine de bildirimler dosyasını manuel olarak oluşturmanız gerekir.
agradl


3

*.jsModern JavaScript ile birden fazla dosya içeren bir kütüphane tek bir TypeScript tanım dosyası oluşturan bazı PowerShell .

İlk olarak, tüm uzantıları olarak değiştirin .ts.

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

İkinci olarak, tanım dosyaları oluşturmak için TypeScript derleyicisini kullanın. Bir sürü derleyici hatası olacak, ancak bunları yok sayabiliriz.

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

Son olarak, tüm *.d.tsdosyaları bir araya getirin index.d.ts, importifadeleri kaldırın ve defaulther dışa aktarma ifadesinden kaldırın.

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 $_ }

Bu index.d.ts, tanımların çoğunu içeren tek, kullanışlı bir dosya ile biter .


2
İkinci adım, Get-ChildItem | foreach {tsc --declaration $ _. Name} çalıştı (eksik --declaration param eklendi)
Guru_07

2

Script # veya SharpKit'i destekleyen 3. taraf JS kütüphanelerinizin mevcut bir eşlemesini ararım. Bu C # - .js çapraz derleyicilerinin kullanıcıları şimdi karşılaştığınız sorunla karşılaşmış olacaklar ve 3. taraf lib'inizi taramak ve iskelet C # sınıflarına dönüştürmek için açık kaynaklı bir program yayınlamış olabilirler. Eğer öyleyse C # yerine TypeScript oluşturmak için tarayıcı programını hackleyin.

Bunu yapmazsanız, 3. taraf kitaplığınız için bir C # genel arabirimini TypeScript tanımlarına çevirmek, kaynak JavaScript'i okuyarak aynı şeyi yapmaktan daha kolay olabilir.

Özel ilgim Sencha'nın ExtJS RIA çerçevesi ve Script # veya SharpKit için bir C # yorumu oluşturmak üzere yayınlanan projeler olduğunu biliyorum


Bilginize: Sencha / ExtJS için ilk daktilo tanımlama dosyamı yaptım
André

hey Camel Case, Extript'leri daktilo ile kullanma hakkında bir blog hazırladım: blorkfish.wordpress.com/2013/01/28/using-extjs-with-typescript
blorkfish 28:13

2

Kendi kitaplığınızı oluştururken *.d.ts, tsc(TypeScript Derleyici) komutunu kullanarak dosya oluşturabilirsiniz : (kitaplığınızı dist/libklasöre oluşturduğunuzu varsayarak )

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): *.d.tsdosyaları oluşturur
  • --declarationDir dist/lib: Oluşturulan bildirim dosyaları için çıktı dizini.
  • --declarationMap: Her karşılık gelen '.d.ts' dosyası için bir kaynak harita oluşturur.
  • --emitDeclarationOnly: Yalnızca '.d.ts' bildirim dosyalarını yayınlayın. (derlenmiş JS yok)

( tüm komut satırı derleyici seçenekleri için dokümanlara bakın )

Veya örneğin package.json:

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

ve ardından çalıştırın: yarn build:types(veya npm run build:types)


d.tsDosyaları nasıl oluşturacağımı ve arayüzleri nasıl kullanabileceğimi hala anlayamıyorum. Hiç örneğin var mı?
Danosaure

Yukarıdaki npm betiği *.d.tsdosyaları oluşturur ve dist/libklasöre koyar . tsconfig.jsonProjenizin kökünde bir dosyaya ihtiyacınız var , ancak projenin yine de çalışması için orada olması gerekir.
magikMaker

Maruz kaldıktan sonra bunları kullanamıyorum. Eğer çalıştırabilirsiniz aşağıdaki yazı stackoverflow.com/questions/59742688 var ?
Danosaure
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.