nodejs için TypeScript dosyası gerekir


97

node_modulesBir TypeScriptsınıf içinden normal bir NodeJS modülünü (buradan ) nasıl yüklerim ?

Şunları .tsiçeren dosyayı derlemeye çalıştığımda :

var sampleModule = require('modulename');

Derleyici, bu kapsamda required kullanamayacağımı soruyor. (bu satır dosyanın başlangıcındadır).


1
Bize kodunuzu gösterebilir misiniz (orijinal ve derlenmiş kod)? Her requireyerde kullanılabileceğini düşündüm , kapsama bağlı değil.
acayip

Evet, ancak beyan edilmesi gerekir ve Valentin'in önerdiği gibi varsayılan lib.d.ts'de bildirilmez.
Zdenek Sejcek

Yanıtlar:


107

Typcript, bir sembol bulamadığında her zaman şikayet eder. Derleyici varsayılan için tanım kümesi ile birlikte gelir window, documentadlı bir dosyada belirtilen ve bu tür lib.d.ts. requireBu dosyada grep yaparsam işlevin tanımını bulamıyorum require. Bu nedenle, derleyiciye bu işlevin çalışma zamanında declaresözdizimini kullanarak var olacağını kendimize söylemeliyiz :

declare function require(name:string);
var sampleModule = require('modulename');

Benim sistemimde bu gayet iyi derleniyor.


23
Teşekkür ederim. Bu, bildirilmemiş tüm işlevler için çalışacaktır. Bulduğum daha iyi çözüm, typecript örneklerinden node.d.ts almak ve ona başvurmaktır. Her şeye sahip olduğunuzdan. Ayrıca express.d.ts var.
Zdenek Sejcek

2
Sanırım siz de yapabilirsinizimport sampleModule = module('modulename')
mpen

Evet, ancak node.d.ts şu anda konumunda v0.8.8. @Valentin tarafından yaklaşımı kullanmak ve daha sonra çalıştırdığınız Düğüm sürümü için tanımları indirebilen ve size otomatik tamamlama vb. Sağlayan WebStorm IDE'yi kullanmak daha iyidir.
Radek

@Radek Bunu nasıl yapıyorsun? WebStorm 7.0.2 (en son) kullanıyorum Btw node.d.ts komut dosyasını bulamıyorum, nerede bulunuyor? Teşekkürler.
Vadorequest

1
Bu yardım etmelidir @Vadorequest: jetbrains.com/webstorm/webhelp/...
Radek

64

Doğru sözdizimi şöyledir:

import sampleModule = require('modulename');

veya

import * as sampleModule from 'modulename';

Ardından TypeScript'inizi --module commonjs.

Paket bir index.d.tsdosya ile package.jsongelmezse ve bir "typings"özelliği tscyoksa, neyin 'modulename'kastettiğini bilmediğini havlayacaktır. .d.tsBunun için http://definitelytyped.org/ adresinde bir dosya bulmanız veya kendiniz bir tane yazmanız gerekir.

Node.js için kod yazıyorsanız, node.d.tsdosyayı http://definitelytyped.org/ adresinden de isteyeceksiniz .


Bu yaklaşımı "scriptjs'den $ s olarak içe aktar" kullanarak izledim; " TypeScript kullandığım için. CKEDITOR.replace () komutu çalışıyor gibi görünüyor ve ondan geçerli bir DOM öğesi gibi görünen bir şey alıyorum, ancak tarayıcıda (hala bir metin alanı) ve editörümde hiçbir şey değişmiyor. On ('contentDom', ...) geri aramaları (ayrıca $ s geri aramasının içine kurulur) asla aranmaz. Ne olduğu hakkında bir fikrin var mı?
Vern Jensen

44

En iyi çözüm, Düğümün tür tanımlarının bir kopyasını almaktır. Bu sadece her türlü bağımlılık sorununu çözmez require(). Bu daha önce gibi paketler kullanılarak yapılmıştı typings, ancak Mike Chamberlain'ın da bahsettiği gibi Yazılar kullanımdan kaldırıldı. Modern yöntem, bunu şu şekilde yapmaktır:

npm install --save-dev @types/node

Yalnızca derleyici hatasını düzeltmekle kalmaz, aynı zamanda Node API'nin tanımlarını IDE'nize ekler.


1
Bu benim için de çalıştı! Ama anlamadığım şey, onu global olarak kurmuştum (yani:) npm install -g @types/nodeama işe yaramadı mı?
Jeach

Türler modülü npm olarak mevcut değilse ne olur?
Sudharshan Nair

@SudharshanNair DefinitelyTyped projesi tarafından tanımlanan birçok tür var. Diğer seçenekler arasında, kendi projenizdeki Kesinlikle yazılmış bildirim türleriyle çelişmek veya tür
tanımları

3

TypeScript'ten düğüm işlevlerine erişmek için yazımları kullanın:

typings install env~node --global

Yazıya sahip değilseniz, kurun:

npm install typings --global

20
Yazımların basitçe lehine kullanımdan kaldırıldığına dikkat edilmelidirnpm install @types/node --save-dev
Mike Chamberlain
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.