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, typeRoots
ve 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 ./typings
klasö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 typeRoots
işaret etmek için bir kurulumunuz olduğunu, ./typings
ancak 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
, ./typings
klasörünüzü taramak ve alt klasörleri custom
ve global
. Daha sonra bunları npm paket türü yazarak yorumlamaya çalışıyor, ancak bu klasörlerde index.d.ts
ya da yok package.json
ve 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/lodash
klasö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ı typeRoots
ve 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 .ts
dosyaya dahil etme :
///<reference path="../typings/custom/lodash.d.ts" />
Dahil ./typings/custom/lodash.d.ts
sizin de files: []
mülk.
Mülkünüze dahil ./typings/index.d.ts
etme files: []
(daha sonra yinelemeli olarak diğer türleri içerir.
Ekleme ./typings/**
için seninincludes:
Umarım, bu tartışmaya dayanarak, tsconfig.json
yaptığı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 typeRoots
ve types
mü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 . types
Bunun 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 typeRoots
modüllerin küresel olarak dahil edilmesiyle ilgili olduğunu söylemiştim . Ama @types/folder
aynı zamanda standart modül çözünürlüğünde de yer alır ( typeRoots
ayarınız ne olursa olsun ).
Özellikle, açıkça ithal modülleri her zaman tüm atlar includes
, excludes
, files
, typeRoots
ve types
seç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
, paths
ve moduleResolution
.
Kullanırken Temel olarak, node
modül çözünürlüğü, bir dosya adı arama başlayacaktır my-module.ts
, my-module.tsx
, my-module.d.ts
klasörün başlayarak sizin tarafından işaret baseUrl
yapılandırması.
Dosyayı bulamazsa, adlandırılmış bir klasör my-module
arayacak ve sonra package.json
bir typings
özelliği olan bir özelliği arayacaktır , içinde hangi dosyanın yükleneceğini söyleyen özellik varsa package.json
veya yoksa o klasör içinde typings
arayacaktır index.ts/tsx/d.ts
.
Hala başarılı olmazsa, bu aynı şeyleri node_modules
klasö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_modules
ve node_modules/@types
orada 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 typeRoots
ayarladığı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, typeRoots
bir 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 .ts
yapabilmek 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
paths
ve nasıl farklıdırinclude
?