2016-01-03 11 views
12

मैं विजुअल स्टूडियो में टाइपस्क्रिप्ट 1.5 में काम कर रहा हूं। मेरे पास app.ts नामक एक मुख्य श्रेणी है, और दूसरा FizzBuzzManager.ts कहा जाता है। मैं यह नहीं समझ सकता कि इस कोड के साथ क्या गलत है, लेकिन यह त्रुटि को आउटपुट करता है, "TypeError: jim.FizzBuzzManager एक कन्स्ट्रक्टर नहीं है"।यह टाइपस्क्रिप्ट आउटपुट क्यों है "[कक्षा] एक निर्माता नहीं है।"

app.ts

namespace jim { 
    class Greeter { 
     element: HTMLElement; 
     span: HTMLElement; 
     timerToken: number; 

     constructor() { 
      window.console.log("constructing Greeter."); 
      this.init(); 
     } 

     private init() { 
      window.console.log("Calling init."); 
      var _fizzBuzzManager: any = new jim.FizzBuzzManager(); 
    } 

} 

    window.onload =() => { 
     window.console.log("Hello") 
     var greeter = new Greeter(); 

}; 

FizzBuzzManager.ts

namespace jim { 

export class FizzBuzzManager { 

    constructor() { 
     window.console.log("Making a FizzBuzzManager."); 
    } 

    public myThing: String = "Hi"; 

    public fizzBuzz2() { 
     window.console.log("fizzbuzzing2 " + this.myThing); 
    } 

} 

export function fizzBuzz() { 
    window.console.log("export function fizzbuzz"); 
} 

} 

उत्पादन जब एक ब्राउज़र में संकलित उत्पादन को देखकर यह है:

Hello             app.js:15:9 
constructing Greeter.         app.js:5:13 
Calling init.           app.js:9:13 
TypeError: jim.FizzBuzzManager is not a constructor app.js:10:36 
+0

आप किस संस्करण का प्रसारण कर रहे हैं? – toskv

+0

कृपया अपनी पारदर्शी लिपि जोड़ें (यानी आपके ब्राउज़र द्वारा उपयोग की जाने वाली '.js' फ़ाइल)। –

+0

लक्ष्य जावास्क्रिप्ट संस्करण ES5 है। – Jim

उत्तर

2

मैं आपकी समस्या को दोहराने की कोशिश की और मैं किसी भी त्रुटि नहीं मिला:

namespace jim { 

export class FizzBuzzManager { 

    constructor() { 
     window.console.log("Making a FizzBuzzManager."); 
    } 

    public myThing: String = "Hi"; 

    public fizzBuzz2() { 
     window.console.log("fizzbuzzing2 " + this.myThing); 
    } 

} 

export function fizzBuzz() { 
    window.console.log("export function fizzbuzz"); 
} 

} 

फिर

app.ts

namespace jim { 
    class Greeter { 
     element: HTMLElement; 
     span: HTMLElement; 
     timerToken: number; 

     constructor() { 
      window.console.log("constructing Greeter."); 
      this.init(); 
     } 

     private init() { 
      window.console.log("Calling init."); 
      var _fizzBuzzManager: any = new jim.FizzBuzzManager(); 
     } 

    } 

    window.onload =() => { 
     window.console.log("Hello") 
     var greeter = new Greeter(); 

    }; 
} 

FizzBuzzManager.ts

c:\Work\TypeScript-playground>node_modules\.bin\tsc --out app.js app.ts FizzBuzzManager.ts 

और संकलित app.js फ़ाइल इस तरह दिखता है:

var jim; 
(function (jim) { 
    var Greeter = (function() { 
     function Greeter() { 
      window.console.log("constructing Greeter."); 
      this.init(); 
     } 
     Greeter.prototype.init = function() { 
      window.console.log("Calling init."); 
      var _fizzBuzzManager = new jim.FizzBuzzManager(); 
     }; 
     return Greeter; 
    })(); 
    window.onload = function() { 
     window.console.log("Hello"); 
     var greeter = new Greeter(); 
    }; 
})(jim || (jim = {})); 
var jim; 
(function (jim) { 
    var FizzBuzzManager = (function() { 
     function FizzBuzzManager() { 
      this.myThing = "Hi"; 
      window.console.log("Making a FizzBuzzManager."); 
     } 
     FizzBuzzManager.prototype.fizzBuzz2 = function() { 
      window.console.log("fizzbuzzing2 " + this.myThing); 
     }; 
     return FizzBuzzManager; 
    })(); 
    jim.FizzBuzzManager = FizzBuzzManager; 
    function fizzBuzz() { 
     window.console.log("export function fizzbuzz"); 
    } 
    jim.fizzBuzz = fizzBuzz; 
})(jim || (jim = {})); 
अपने कंसोल में

क्रोम ब्राउज़र रिपोर्ट:

app.js:15 Hello 
app.js:5 constructing Greeter. 
app.js:9 Calling init. 
app.js:24 Making a FizzBuzzManager. 

त्रुटि तुम यहाँ हो रही है की एक अच्छी व्याख्या नहीं है: Javascript: TypeError: ... is not a constructor (यह नहीं कि यह समस्या की उत्पत्ति का खुलासा करता है लेकिन आप अपने पारदर्शी कोड में समस्या देख सकते हैं।)

+0

धन्यवाद, लेकिन मैं tsc फ़ाइल पथ कैसे प्राप्त करूं? – Jim

+0

मैंने इसे अपने कमांड लाइन –

+0

में 'npm इंस्टॉल टाइपस्क्रिप्ट @ 1.5' के माध्यम से स्थापित किया है यह आपके वर्तमान कार्यशील निर्देशिका में टाइपस्क्रिप्ट स्थापित करें, ताकि आप इसे आसानी से आज़मा सकें। –

12

TypeError: jim.FizzBuzzManager is not a constructor

आप सही क्रम में फ़ाइलों को लोड करने के लिए जिम्मेदार हैं:

यह एक सामान्य त्रुटि जब आप --out का उपयोग करें। बाहरी मॉड्यूल का उपयोग न करें और

+0

धन्यवाद। मैं सही क्रम में चीजें लोड नहीं कर रहा था। यह त्रुटि के साथ मेरा मुद्दा था। – Hath

+0

लिंक टूट गया है – KimchiMan

+1

@ किमचीमेन धन्यवाद। स्थिर – basarat

3

यह इसके बारे में सोचने के लिए के रूप में यदि आप जावास्क्रिप्ट में कोड लिख रहे थे सीधे उपयोगी हो सकता है। मैं इस सवाल पर आया क्योंकि मुझे टाइपस्क्रिप्ट में लिखे गए एक कोणीय 2 टेस्ट स्पेक में एक ही त्रुटि मिली है। उपर्युक्त उत्तरों के आधार पर इसके बारे में सोचने के बाद, मुझे एहसास हुआ कि जावास्क्रिप्ट को यह नहीं पता होगा कि आपकी बज़फिड क्लास के बराबर क्या है क्योंकि यह फ़ाइल के निचले हिस्से में था।

मैंने अपने पहले वर्णन कथन से पहले कक्षा के शीर्ष पर कक्षा को स्थानांतरित कर दिया और सबकुछ काम करता है। सोचा कि यह दूसरों की तरह दूसरों की मदद कर सकता है।

2

मैं इस सवाल पर आया कि "टाइपस्क्रिप्ट एक निर्माता नहीं है"। दुर्भाग्यवश, इन उत्तरों ने मेरी समस्या का समाधान नहीं किया। मुझे अंत में समाधान मिला, इसलिए मैं इसे यहां पोस्टरिटी के लिए पोस्ट कर रहा हूं।

समस्या

मैं निम्नलिखित टाइपप्रति वर्ग परिभाषित:

module mymodule { 
    export class myclass { 
     addDocuments(parentId: string) { 
     // Code removed for brevity... 
     } 
    } 
} 

मैं तो एक अलग मॉड्यूल में वर्ग कहा जाता है:

module mymodule.test { 

    var myClass = new mymodule.myclass(); 

    export function initialize(): void { 
     myClass.addDocuments("test123"); 
    } 
} 

संकलन के बाद और जब तक लोड करने का प्रयास पृष्ठ जो परिणामी जावास्क्रिप्ट निष्पादित करता है, पृष्ठ ठीक से लोड नहीं होगा और मैंने निम्न जेएस अपवाद देखा:

Uncaught TypeError: mymodule.myclass is not a constructor

समाधान

एक साथी डेवलपर बताते है कि मैं अपने समारोह के अंदर वस्तु की इन्स्टेन्शियशन स्थानांतरित करने के लिए की जरूरत तरह पर्याप्त था। तो अब मेरा तत्काल कोड इस तरह दिखता है और यह काम करता है जैसा कि इसे करना चाहिए:

module mymodule.test { 

    var myClass: mymodule.myclass; 

    export function initialize(): void { 
     myClass = new mymodule.myclass(); 
     myClass.addDocuments("test123"); 
    } 
} 
संबंधित मुद्दे