2015-07-01 11 views
8

मैं टाइपस्क्रिप्ट पर नया हूं। मुझे यह विचार पसंद है कि संकलक त्रुटियों को सबसे अधिक इंगित करेगा, क्योंकि वह वास्तव में कोड प्राप्त करता है।टाइपस्क्रिप्ट: कक्षाओं को कैसे आयात करें ("असीमित संदर्भ त्रुटि")

Uncaught ReferenceError: नाव से परिभाषित नहीं है (अनाम समारोह) @ Main.ts: 7

जाहिर आयात करना अब मैं एक परीक्षण परियोजना, कोई संकलक त्रुटियों, लेकिन क्रम पर अपवाद ठहराया है काम नहीं। पर क्यों? मैंने एएमडी और कॉमनज के साथ कोशिश की और एक ही त्रुटि मिली।

यहाँ कोड:

index.html

<!DOCTYPE html> 

<html> 
<head> 
    <title>TypeScript Test</title> 
    <script data-main="main" type="text/javascript" src="require.js"></script> 
</head> 
<body> 

<span id="output"></span> 

</body> 
</html> 

Main.ts

///<reference path='Vehicle.ts'/> 
///<reference path='Car.ts'/> 
///<reference path='Boat.ts'/> 

var outputElement = document.getElementById('output'); 

var vehicleOne: Vehicle.Vehicle = new Boat.Boat("One"); 
var car: Car.Car = new Car.Car("Two"); 
var vehicleTwo: Vehicle.Vehicle = car; 

outputElement.innerHTML = vehicleOne.do() + " " + vehicleOne.getName() + "<br />" 
         + vehicleTwo.do() + " " + vehicleTwo.getName() + "<br />" 
         + car.do() + " " + car.getName() + " " + car.doCar() + "<br />"; 

Vehicle.ts

module Vehicle{ 

    export class Vehicle 
    { 
     private name: string; 

     constructor (name: string) 
     { 
      this.name = name; 
     } 

     do() : string 
     { 
      return "Im a vehicle"; 
     } 

     getName() : string 
     { 
      return this.name; 
     } 
    } 

} 

Car.ts

///<reference path='Vehicle.ts'/> 

module Car { 

    export class Car extends Vehicle.Vehicle { 
     constructor(name:string) { 
      super("CAR: " + name); 
     } 

     do():string { 
      return "Im a car"; 
     } 

     doCar():string { 
      return "Only cars can do this :)"; 
     } 
    } 

} 

Boat.ts

///<reference path='Vehicle.ts'/> 

module Boat { 

    export class Boat extends Vehicle.Vehicle { 
     constructor(name:string) { 
      super("BOAT " + name); 
     } 

     do():string { 
      return "Im a boat"; 
     } 
    } 

} 

मैं Webstorm, संकलक आउटपुट कोई त्रुटि है, और * .js और प्रयोग * फ़ाइलों .map.js बनाया है। ब्राउज़र में कोई आउटपुट नहीं है। केवल कंसोल प्रिंट करता है "Uncaught ReferenceError: नाव परिभाषित नहीं किया गया है (अनाम कार्य) @ Main.ts: 7"

यह अपवाद क्यों? मैं कक्षाओं को सही ढंग से कैसे आयात करूं?

उत्तर

6

मुझे संदेह है कि आपकी परियोजना प्रत्येक .ts फ़ाइल को एक अलग .js फ़ाइल में संकलित करने के लिए सेट है। यदि यह मामला है तो केवल Main.js लोड हो जाएंगे, लेकिन boat.js, car.js, आदि में आपको कोई त्रुटि नहीं होगी।

आप एक एकल फाइल में उत्पादन संकलित करने के लिए तो टाइपप्रति संकलक अन्य .ts फाइलों में खींच सकते हैं और एक भी .js का निर्माण करने के < संदर्भ > टैग का उपयोग करेगा अपनी परियोजना को बदलते हैं फ़ाइल आप एक टैग के साथ संदर्भित कर सकते हैं।

यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं तो आपके प्रोजेक्ट सेटिंग्स के टाइपस्क्रिप्ट बिल्ड के तहत 'फ़ाइल में जावास्क्रिप्ट आउटपुट को संयोजित करें' विकल्प है। यदि आप कमांड लाइन कंपाइलर का उपयोग करते हैं तो आउटआउट ध्वज का उपयोग एकल बनाने के लिए किया जा सकता है फ़ाइल -। अधिक जानकारी के लिए http://www.typescriptlang.org/Handbook#modules-splitting-across-files देख

+0

धन्यवाद, वास्तव में काम किया। मैं वेबस्टॉर्म का उपयोग करता हूं और मैंने कंपाइलर कमांड लाइन विकल्पों में तर्क --आउट "जेनरेट.जेएस" जोड़ा है। (इसकी प्राथमिकताओं के तहत)।तो एचटीएमएल में अब "मुख्य", लेकिन "जेनरेट" फ़ाइल का उपयोग नहीं कर रहा हूं। तो धन्यवाद, आपने इसे ठीक किया :) –

+0

महान उत्तर ... लेकिन अगर मामला है तो मैं test.js से car.js को कॉल करने का प्रयास कर रहा हूं ...., मैं उन्हें एक फ़ाइल में शामिल नहीं कर सकता ... –

+0

यदि आप एक फ़ाइल नहीं बना सकते हैं तो क्या आप अपने एचटीएमएल में दो

-2

प्रयास करें

window.Something = Something; 

मेरे मामले में, यह बनाता है Something सुलभ विश्व स्तर पर

1

मैं ने वही समस्या थी, और यह html फ़ाइल की वजह से था आयात नहीं। ए जावास्क्रिप्ट फाइलें करेंगे। अपनी स्थिति को हल करने के लिए आप Vehicle.js, Car.js और Boat.js को अपनी index.html फ़ाइल में जोड़ देंगे।

संबंधित मुद्दे