Typcript'ten npm modülleri nasıl tüketilir?


91

Daktilo ile bir şans veriyorum. Merhaba dünya sahnesinde iyi çalışıyor. Şimdi bir npm modülü kullanmaya çalışıyorum:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

Bu çalışmıyor:

  • tsc index.ts -> Cannot find module 'lodash'. (2307)
  • node-ts index.js -> Cannot find module 'lodash'. (2307)

Typcript belgelerine bakmak ve google yardımcı olmadı. Diğer S / O soruları ya cevapsızdır ( burada ve burada ) veya ilgisizdir.

Elementler :

  • typescript 1.8 en son
  • Evet, lodash kuruldu npm i --save lodashve dosya sistemimde var (işaretlendi)
  • Ben de yaptım typings i --save lodash
  • varyantlar import * as _ from 'lodash'ya const _ = require('lodash')da çalışmıyor
  • Diğer yanıtlarda önerildiği gibi tsconfig.json seçeneklerini değiştirmeyi denedim "moduleResolution": "node"ve "module": "commonjs"bazı yanıtlarda önerildiği gibi hala çalışmıyor

Typcript'te npm paketini nasıl tüketiriz?


2
İndex.ts dosyanıza lodash.d.ts referansı eklediniz mi? Şuna benzer görünmeli: ///<reference path="../typings/lodash/lodash.d.ts"/>
Granga

@Granga Çalışıyor. Bunu bir cevap olarak ekleyebilir misin?
Offirmo

2
Çalıştığına sevindim. Blackus cevabı zaten ekledi ve önerdiğim şeyi daha da iyi belirliyor. Yine de bir not: Girdi dosyaları komut satırında belirtildiğinde (sizin durumunuz budur), tsconfig.json dosyaları yok sayılır. ( kaynak )
Granga

Yanıtlar:


61

[DÜZENLE] Bu yanıt için çok teşekkürler! Ancak 2018 itibariyle modası geçmiş durumda. Okuyucular, diğer cevaplara bir göz atın.

Modülleri npm'den içe aktarmanın birkaç yolu vardır. Ancak yazımları alamazsanız, tscher zaman ihtiyaç duyduğunuz modülü bulamadığından şikayet eder (aktarılmış js gerçekten çalışıyor olsa bile ).

  • Yazılarınız varsa ve a tsconfig.jsonkullanmıyorsanız reference, yazılarını içe aktarmak için kullanın:

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • Bir tsconfig.jsondosya kullanıyorsanız , yazma dosyanızın dahil edildiğinden (veya hariç tutulmadığından, seçiminiz olduğundan) emin olun importve önceki örnekte benzerini yapın.

Kullanılabilir yazı olmadığı durumda. İki seçeneğiniz var: bir .d.tsdosyaya kendiniz yazın veya kitaplık için tür kontrolünü göz ardı edin.

Tür denetimini tamamen yok saymak için (bu, önerilen yol değildir), kitaplığı bir tür değişkenine aktarın any.

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tscrequirevar olmadığından şikayet edecek . nodeYazıları sağlayın veya declarehatayı atın.


2
3 çözümle tam cevap. +1
Offirmo

Ek: ts-nodeYazım indeksitsconfig.json
Offirmo

"Hatayı reddettiğini beyan et" derken ne demek istediğin kafam karıştı. İçe aktarmaya çalıştığım modülde bu değişikliği yapmam gerekir mi?
Slug

1
Bu cevap ciddi şekilde modası geçmiş. Yeni
cevabıma

50

[2018/12] 2016'da sorduğum bu soruya yeni, güncel cevap; cevapları geçerliliğini yitirmiş olmasına rağmen hala çok fazla etkinlik gösteriyor.

Uzun lafın kısası, TypeScript , paketinizin kodu hakkında tür bilgileri gerektirir (diğer adıyla " tür bildirimi dosyaları " aka "tipler") ve haklı olarak size aksi takdirde TypeScript'in tüm noktasını kaybedeceğinizi söyler. Bunları sağlamak veya devre dışı bırakmak için en iyi uygulama sırasına göre aşağıda listelenen birkaç çözüm vardır:


Çözüm 0 : Modül zaten yazımları sağlıyor. Package.json, aşağıdaki gibi bir satır içeriyorsa:

"typings": "dist/index.d.ts",

zaten TypeScript etkin. Bu sayfayı okuyorsanız büyük olasılıkla durum böyle değildir, o yüzden devam edelim ...


Çözüm 1 : Kullanım topluluk katkıda typings DefinitelyTyped . Bir "foo" modülü için şunu deneyin:

npm add -D @types/foo

işe yararsa, ikramiye! Artık yazılara sahipsiniz ve modülünüzü kullanabilirsiniz. Npm @ types / foo modülünü bulamadığından şikayet ederse, devam edelim ...


Çözüm 2 : Bu modülü hakkında özel typings sağlarlar. (sıfır çaba yapma seçeneği ile)

  1. Projenizin kök dizininde "typings-custom" adlı bir klasör oluşturun
  2. Tsconfig.json dosyanızda bu klasörün içeriğine bakın:
"include": [
    "./typings-custom/**/*.ts"
]
  1. Tam olarak bu ada sahip bir dosya oluşturun: foo.d.ts [foo = modülün adı] içeriğiyle:
declare module 'foo'

TypeScript kodunuz, NO tip bilgisiyle de olsa, şimdi derlenmelidir (TypeScript "herhangi" türündeki foo modülünü dikkate alır).

Resmi belgeye ve / veya DefinitelyTyped örneklerine bakarak tip bilgilerini kendiniz de yazmaya çalışabilirsiniz . Eğer öyleyse, yazdıklarınızı doğrudan modüle (modül yazarı kabul ederse çözüm 0) veya DefinitelyTyped (çözüm 1) içine eklemeyi düşünün.


1
@Offirmo, Tek bir dosyada birden fazla özel yazım da beyan edebiliriz! Yani, birden fazla dosyaya gerek yok (Belki?).
lazycipher

2. Adım Reference the content of this folder in your tsconfig.json:şu hatayı veriyor: Unknown compiler option 'include'.
Sumit

1
@Sumit bu bir derleyici seçeneği değil, kardeşi olmalıcompilerOptions
Offirmo

22

Muhtemelen Beyanname Dosyalarını kaçırıyorsunuz .

Daha fazla bilgi için DefinitelyTyped konusuna bakın .


Bunu dene:

npm install --save lodash
npm install --save @types/lodash

Şimdi içe aktarabilirsiniz.

import _ from 'lodash';

İçe aktardığınız modülün birden çok dışa aktarması varsa , bunu yapabilirsiniz:

import { Express, Router } from 'express';

İçe aktardığınız modül "varsayılan dışa aktarmaya sahip değilse ", bunu yapmanız gerekir:

import * as http from 'http';

Neden ES6 kodundaki gibi * as _değil de kullanmalıyız _ from 'lodash'?
JohnnyQ

@JohnnyQ İyi nokta. import _ from 'lodash';Bu durumda kullanmak daha iyidir. Cevabımı, içe aktarmanın farklı yollarını ve bunları neden kullanacağınızı gösterecek şekilde güncelledim.
Derek Soike

1
* as _ Modül varsayılan ihracat varsa gereklidir. Tsc derleyicisi bu konuda uyaracaktır.
user2867342

"Varsayılan dışa aktarma yok" ifadesi, Typescript türünün tanımlanmadığı anlamına mı gelir (yani düz bir JavaScript modülünün içe aktarılması)? JS / Typescript'te yeniyim ....
Big Rich

2
@BigRich "Varsayılan dışa aktarım yok", modülün bir export default <...>deyimi olmadığı anlamına gelir . Typecript Modules Documentation'ın "Default export " bölümüne bir göz atın .
Derek Soike

4

Benim için çalıştı.

  1. "Typings" adlı bir klasör oluşturun.
  2. Typings klasöründe, module-name.d.ts dosya adı oluşturun . Bu içerir:

    declare module "module-name";

  3. Tsconfig.json içinde, klasöre bakın

    "typeRoots": [ "./typings", "../node_modules/@types" ]


Selam! Katkıda bulunduğunuz için teşekkürler. Bu yöntem zaten cevabıma dahil edilmiştir ve yalnızca son çare olarak kullanılmalıdır.
Offirmo

3. adım: In tsconfig.json, refer to the folderaşağıdaki hatayı veriyor:Unknown compiler option 'typesRoots'.
Sumit

1
@Sumit benim durumumda, "typesRoots" "compilerOptions" ın içinde
Quynh Ngo

1
Bu typeRoots, typeRoots değil ve compilerOptions içinde olmalıdır
CM

0

Bu hatayı alıyorum ve cevapların hiçbiri benim için işe yaramadı, ancak daktilo modülünde düğüm modülüyle çalışmak istediğinizde bir şeyi anladım .

$npm install @types/<module_name>

Örneğin

npm install @types/cheerio

demek yerine

npm install cheerio
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.