Maalesef bu şeyler şu anda çok iyi belgelenmemiştir, ancak çalıştırmayı başardıysanız bile, yapılandırmanızı gözden geçirelim, böylece her bir parçanın ne yaptığını ve yazımları nasıl işlediğini ve yüklediğini anlayabilirsiniz.
Öncelikle, aldığınız hatanın üzerinden geçelim:
error TS2688: Cannot find type definition file for 'lodash'.
Bu hata aslında içe aktarmalarınızdan veya referanslarınızdan veya ts dosyalarınızın herhangi bir yerinde lodash kullanma girişiminizden kaynaklanmamaktadır. Daha ziyade, typeRootsve typesözelliklerinin nasıl kullanılacağına dair bir yanlış anlaşılmadan kaynaklanıyor , bu yüzden bunlar hakkında biraz daha ayrıntıya girelim.
typeRoots:[]Ve types:[]özellikleriyle ilgili olan şey , bunların rasgele bildirim ( ) dosyalarını yüklemenin genel amaçlı yolları OLMAMASIDIR*.d.ts .
Bu iki özellik, NPM paketlerinden paketleme ve yükleme tipleme bildirimlerine izin veren yeni TS 2.0 özelliği ile doğrudan ilişkilidir .
Bunların sadece NPM formatındaki klasörlerle (yani bir package.json veya index.d.ts içeren bir klasör) ile çalıştığını anlamak çok önemlidir .
Varsayılan değer typeRoots:
{
"typeRoots" : ["node_modules/@types"]
}
Varsayılan olarak bu, typcript'innode_modules/@types klasöre gideceği ve orada bulduğu her alt klasörü npm paketi olarak yüklemeye çalışacağı anlamına gelir .
Bir klasör npm paketi benzeri bir yapıya sahip değilse bunun başarısız olacağını anlamak önemlidir.
Bu, sizin durumunuzda olan ve ilk hatanızın kaynağıdır.
TypeRoot'u şu şekilde değiştirdiniz:
{
"typeRoots" : ["./typings"]
}
Bu, typcript'in artık ./typingsklasörü alt klasörler için tarayacağı ve bulduğu her alt klasörü npm modülü olarak yüklemeye çalışacağı anlamına gelir .
Öyleyse, sadece typeRootsişaret etmek için bir kurulumunuz olduğunu, ./typingsancak henüz herhangi bir types:[]mülk kurulumunuz olmadığını varsayalım. Muhtemelen şu hataları görürsünüz:
error TS2688: Cannot find type definition file for 'custom'.
error TS2688: Cannot find type definition file for 'global'.
Bunun nedeni tsc, ./typingsklasörünüzü taramak ve alt klasörleri customve global. Daha sonra bunları npm paket türü yazarak yorumlamaya çalışıyor, ancak bu klasörlerde index.d.tsya da yok package.jsonve bu nedenle hatayı alıyorsunuz.
Şimdi types: ['lodash']ayarladığınız mülk hakkında biraz konuşalım . Bu ne yapar? Varsayılan olarak, typcript, içinde bulduğu tüm alt klasörleri yükleyecektir typeRoots. Bir belirtirseniztypes: özellik , yalnızca bu belirli alt klasörleri yükleyecektir.
Sizin durumunuzda, ./typings/lodashklasörü yüklemesini söylüyorsunuz, ancak mevcut değil. Bu yüzden şunları elde edersiniz:
error TS2688: Cannot find type definition file for 'lodash'
Öyleyse öğrendiklerimizi özetleyelim. Typescript 2.0 tanıtıldı typeRootsve npm paketlerindetypes paketlenmiş bildirim dosyalarını yüklemek için . Npm paketi kurallarını izleyen bir klasörde bulunmayan özel yazılarınız veya tek bir gevşek dosyalarınız varsa, bu iki yeni özellik kullanmak istediğiniz şey değildir. Typecript 2.0, bunların nasıl tüketileceğini gerçekten değiştirmez. Bu dosyaları birçok standart yoldan biriyle derleme bağlamınıza dahil etmeniz yeterlidir:d.ts
Doğrudan bir .tsdosyaya dahil etme :
///<reference path="../typings/custom/lodash.d.ts" />
Dahil ./typings/custom/lodash.d.tssizin de files: []mülk.
Mülkünüze dahil ./typings/index.d.tsetme files: [](daha sonra yinelemeli olarak diğer türleri içerir.
Ekleme ./typings/**için seninincludes:
Umarım, bu tartışmaya dayanarak, tsconfig.jsonyaptığınız şeylere neden kızdırdığınız değişikliklerin tekrar işe yaradığını söyleyebileceksiniz .
DÜZENLE:
Ben söz unuttuğunu bir şey olduğunu typeRootsve typesmülkiyet gerçekten sadece yararlıdır otomatik küresel beyanlarına yüklenmesi.
Örneğin eğer
npm install @types/jquery
Ve Jquery türleri paket otomatik yüklenecektir o, varsayılan tsconfig kullanıyor ve $başka yapmak zorunda wihtout tüm komut satışa sunulacak ///<reference/>ya daimport
typeRoots:[]Mülkiyet tipi nereden Başka yerler eklemek anlamına gelir paketleri otomatik ettirmesi yüklenecektir.
types:[]Tesisin birincil kullanım-case (boş bir diziye ayarlayarak) otomatik yükleme davranışı devre dışı bırakmaktır ve sonra sadece küresel dahil etmek istediğiniz belirli türlerini listeler.
Çeşitli paketlerden tür paketleri yüklemenin diğer yolu typeRoots, yeni ///<reference types="jquery" />yönergeyi kullanmaktır . typesBunun yerine dikkat edin path. Yine, bu yalnızca genel bildirim dosyaları için kullanışlıdır, genellikle işe yaramayan dosyalar import/export.
Şimdi, işte kafa karışıklığına neden olan şeylerden biri typeRoots. Unutmayın, bunun typeRootsmodüllerin küresel olarak dahil edilmesiyle ilgili olduğunu söylemiştim . Ama @types/folderaynı zamanda standart modül çözünürlüğünde de yer alır ( typeRootsayarınız ne olursa olsun ).
Özellikle, açıkça ithal modülleri her zaman tüm atlar includes, excludes, files, typeRootsve typesseçenekleri. Yani yaptığınızda:
import {MyType} from 'my-module';
Yukarıda belirtilen tüm özellikler tamamen göz ardı edilmiştir. Sırasında ilgili özellikler modül çözünürlüğü vardır baseUrl, pathsve moduleResolution.
Kullanırken Temel olarak, nodemodül çözünürlüğü, bir dosya adı arama başlayacaktır my-module.ts, my-module.tsx, my-module.d.tsklasörün başlayarak sizin tarafından işaret baseUrlyapılandırması.
Dosyayı bulamazsa, adlandırılmış bir klasör my-modulearayacak ve sonra package.jsonbir typingsözelliği olan bir özelliği arayacaktır , içinde hangi dosyanın yükleneceğini söyleyen özellik varsa package.jsonveya yoksa o klasör içinde typingsarayacaktır index.ts/tsx/d.ts.
Hala başarılı olmazsa, bu aynı şeyleri node_modulesklasörünüzden başlayarak arayacaktır baseUrl/node_modules.
Ayrıca bunları bulamazsa baseUrl/node_modules/@types, aynı şeyleri arayacaktır .
Hala bir şey bulamadıysa, ana dizine gitmeye node_modulesve node_modules/@typesorada aramaya başlayacaktır . Dosya sisteminizin köküne ulaşıncaya kadar dizinlerde yukarı çıkmaya devam edecektir (hatta projenizin dışındaki düğüm modüllerini bile alacaktır).
Vurgulamak istediğim bir şey, modül çözünürlüğünün typeRootsayarladığınız her şeyi tamamen yok saymasıdır . Yani yapılandırdıysanız typeRoots: ["./my-types"], bu, açık modül çözümlemesi sırasında aranmayacaktır. Yalnızca, daha fazla içe aktarmaya veya referans göstermeye gerek kalmadan tüm uygulama için kullanılabilir hale getirmek istediğiniz global tanım dosyalarını koyabileceğiniz bir klasör görevi görür.
Son olarak, modül davranışını yol eşlemeleriyle (yani pathsözellik) geçersiz kılabilirsiniz . Örneğin, typeRootsbir modülü çözmeye çalışırken herhangi bir geleneğe danışılmadığından bahsetmiştim . Ancak hoşunuza gittiyse, bu davranışı şu şekilde gerçekleştirebilirsiniz:
"paths" :{
"*": ["my-custom-types/*", "*"]
}
Bunun yaptığı şey, sol tarafla eşleşen tüm içe aktarmalar için, içe aktarmayı dahil etmeye çalışmadan önce sağ taraftaki gibi değiştirmeyi deneyin ( *sağ taraf, ilk içe aktarma dizenizi temsil eder. Örneğin, içe aktarırsanız:
import {MyType} from 'my-types';
Önce, yazmışsınız gibi içe aktarmayı deneyecektir:
import {MyType} from 'my-custom-types/my-types'
Ve sonra bulamazsa, önekle tekrar deneyecekti (dizideki ikinci öğe sadece *ilk içe aktarma anlamına geliyor.
Bu şekilde, özel bildirim dosyalarını ve hatta .tsyapabilmek istediğiniz özel modülleri aramak için ek klasörler ekleyebilirsiniz import.
Ayrıca belirli modüller için özel eşlemeler de oluşturabilirsiniz:
"paths" :{
"*": ["my-types", "some/custom/folder/location/my-awesome-types-file"]
}
Bu yapmana izin verirdi
import {MyType} from 'my-types';
Ama sonra bu türleri buradan okuyun some/custom/folder/location/my-awesome-types-file.d.ts
pathsve nasıl farklıdırinclude?