2015-10-05 30 views
28

तो कोड सरल है:टाइपप्रति संकलक त्रुटि json फ़ाइल आयात

calls.json

{"SERVER":{ 
    "requests":{ 
     "one":"1" 
    } 
} } 

file.ts

import json = require('../static/calls.json'); 
console.log(json.SERVER); 

उत्पन्न जावास्क्रिप्ट सही है और जब नोड चल जेएस सर्वर, कंसोल लॉग जेसन। सर्वर प्रिंट '{अनुरोध: {एक:' 1 '}}', जैसा कि इसे करना चाहिए।

टाइपस्क्रिप्ट कंपाइलर (कॉमनज) हालांकि, किसी भी तरह से विशेष रूप से इस स्थिति को पसंद नहीं करता है और फेंकता है: "मॉड्यूल नहीं ढूंढ सकता" ../static/calls.json '"। तो

declare module '../static/calls.json'{ 
    var exp:any; 
    export = exp; 
} 

इस स्पष्ट रूप से फेंकता है:

बेशक मैं एक .d.ts फ़ाइल लेखन, इस तरह की कोशिश की "परिवेश मॉड्यूल घोषणा रिश्तेदार मॉड्यूल का नाम निर्दिष्ट नहीं कर सकते"।

मैं भी अलग-अलग रूपों की कोशिश की तरह,: की आवश्यकता होती है

declare module 'calls.json' { 
    import * as json from '/private/static/calls.json'; 
    export = json; 
} 

और उसके बाद:

import json = require('calls.json'); 

कोई भी काम ठीक से और अपने स्वयं के छोटे संकलक त्रुटियों :)

मैं उपयोग करना चाहते हैं एक बाहरी .json फ़ाइल क्योंकि मैं कॉमनज सर्वरसाइड और एएमडी क्लाइंटसाइड का उपयोग करता हूं और मैं स्थिरांक लोड करने के लिए एक फ़ाइल चाहता हूं।

उत्तर

44

import के बजाय var का उपयोग करें।

var json = require('./calls.json'); 

आप एक JSON फ़ाइल लोड कर रहे हैं, एक मॉड्यूल नहीं है, इसलिए import नहीं किया जाना चाहिए यदि यह मामला है। जब var का उपयोग किया जाता है, require() को फिर से सामान्य फ़ंक्शन की तरह माना जाता है।

यदि आप एक नोड.जेएस परिभाषा का उपयोग कर रहे हैं, तो सबकुछ सिर्फ काम करना चाहिए, अन्यथा require को परिभाषित करने की आवश्यकता होगी।

+0

यह काम करेगा, हालांकि मैं requirejs क्लाइंटसाइड का उपयोग कर रहा हूं। इसका मतलब है कि requjs परिभाषा को लोड करते समय, नोड परिभाषा में घोषित var की आवश्यकताएं समस्याएं पैदा करती हैं क्योंकि आवश्यकताएँ.d.ts में एक var आवश्यकता भी घोषित की गई थी ... – Ken

+1

युप, यह अपेक्षा की जाती है कि दोनों परिभाषाओं को एक बार में संदर्भित किया जाता है। रनटाइम पर यह भी मामला होगा। आप एक ही समय में 'आवश्यकता' दोनों का उपयोग नहीं करेंगे। त्वरित समाधान यह है कि उस फ़ाइल में से कोई भी संदर्भ नहीं दे रहा है और केवल 'var var घोषित करें: किसी भी;' का उपयोग करें। – thoughtrepo

+0

अच्छी प्रतिक्रिया, मैं एक कामकाज कपड़े दूंगा ... – Ken

12

यह भी import कथन का उपयोग करता है, तो webpack v2 जो पहले से ही json-loader साथ पैक किया जाता उपयोग करके किया जा कर सकते हैं।

ध्यान दें कि यह

import data from './data.json';//Note that this is not async 

इसके अलावा, async नहीं है अपने typings.d में।ts कह टाइपप्रति त्रुटि से बचने के लिए निम्न wildcard module जोड़ने: Cannot find module

declare module "*.json" { 
    const value: any; 
    export default value; 
} 

async आयात में रुचि किसी के लिए, जाँच this article by 2uality

10

एक अन्य समाधान इस

export default { 
    "key" : { 
    ... 
    } 
} 
तरह data.ts और निर्यात करने के लिए data.json बदलने के लिए है

और जैसा कि आप उम्मीद करेंगे आयात करें:

import * as data from './data.ts' 
+4

'./data.ts' से आयात {डेटा के रूप में डिफ़ॉल्ट}; –

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