"... একটি অ-মডিউল সত্তার সমাধান হয়েছে এবং এই নির্মাণ ব্যবহার করে আমদানি করা যায় না" এর অর্থ কী?


93

আমার কিছু টাইপস্ক্রিপ্ট ফাইল রয়েছে:

MyClass.ts

class MyClass {
  constructor() {
  }
}
export = MyClass;

MyFunc.ts

function fn() { return 0; }
export = fn;

MyConsumer.ts

import * as MC from './MyClass';
import * as fn from './MyFunc';
fn();

এটি ব্যবহারের চেষ্টা করার সময় আমাকে ত্রুটি দেয় new

মডিউল "মাইক্লাস" একটি নন-মডিউল সত্তাকে সমাধান করে এবং এই নির্মাণটি ব্যবহার করে আমদানি করা যায় না।

এবং কল করার চেষ্টা করার সময় fn()

যার প্রকারে কল স্বাক্ষরের অভাব রয়েছে এমন একটি অভিব্যক্তি চাওয়া যায় না।

শেষ ঘন্টা?


4
একটি উত্তর ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি মুছে ফেলার জন্য সুপারিশ করবে javascriptএকটি প্রাথমিক ট্যাগ এবং ছুটি হিসেবে ecmascript-6, কারণ এখানে প্রাথমিক ট্যাগ হয় typescript। প্রশ্নটি ভুলভাবে ধরেছে যে export =(একটি টিএস বৈশিষ্ট্য) যুক্ত করা যেতে পারে import ... from, যদিও এটি যুক্ত করা উচিতimport = । এটি মূলত ইএস 6 মডিউল আমদানি / এক্সপোর্ট বনাম সিজেএস / এএমডি।
এস্তাস ফ্লাস্ক

উত্তর:


158

কেন এটি কাজ করে না

import * as MC from './MyClass';

এটি ES6 / ES2015- স্টাইল importসিনট্যাক্স। এর সঠিক অর্থ হ'ল "মডিউল নামস্থান স্থানটি লোড হওয়া ./MyClassএবং এটি স্থানীয়ভাবে ব্যবহার করুন MC"। উল্লেখযোগ্যভাবে, "মডিউল নেমস্পেস অবজেক্ট " বৈশিষ্ট্যযুক্ত কেবল একটি সরল বস্তু নিয়ে গঠিত। কোনও ES6 মডিউল অবজেক্টটি কোনও ফাংশন হিসাবে বা এর সাথে ডাকা যাবে নাnew

এটি আবার বলার জন্য: কোনও ES6 মডিউল নেমস্পেস অবজেক্টটি কোনও ফাংশন হিসাবে বা এর সাথে ডাকা যাবে না new

আপনি মডিউল থেকে যে জিনিসটি importব্যবহার করছেন * as Xতা কেবলমাত্র বৈশিষ্ট্যগুলিতেই সংজ্ঞায়িত করা হয়েছে। ডাউনলেভেল্ড কমনজেএসে এটি পুরোপুরি সম্মানিত নাও হতে পারে তবে টাইপস্ক্রিপ্ট আপনাকে বলে দিচ্ছে যে স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত আচরণটি কী।

কি কাজ করে?

এই মডিউলটি ব্যবহার করতে আপনাকে সাধারণ জেএস-স্টাইল আমদানি বাক্য গঠন ব্যবহার করতে হবে:

import MC = require('./MyClass');

আপনি যদি উভয় মডিউল নিয়ন্ত্রণ করেন তবে আপনি এর export defaultপরিবর্তে ব্যবহার করতে পারেন :

MyClass.ts

export default class MyClass {
  constructor() {
  }
}

MyConsumer.ts

import MC from './MyClass';

আমি এ সম্পর্কে দুঃখিত; বিধিগুলি বোবা হয়।

ইএস 6 আমদানি সিনট্যাক্সটি ব্যবহার করে ভাল লাগত তবে এখন আমাকে এই import MC = require('./MyClass');জিনিসটি করতে হবে ? এটা 2013! পঙ্গু! তবে দুঃখ প্রোগ্রামিংয়ের একটি সাধারণ অঙ্গ। Kübler-Ross মডেল: স্বীকৃতি: পাঁচ মঞ্চে লাফ দিন।

এখানে টাইপস্ক্রিপ্ট আপনাকে বলছে এটি কাজ করে না, কারণ এটি কাজ করে না। হ্যাকগুলি রয়েছে ( এটির namespaceকাছে একটি ঘোষণাকে যুক্ত করার পক্ষে MyClassএটি জনপ্রিয় কাজ করার উপায়) এবং এগুলি আজ আপনার বিশেষ ডাউনলভেলিং মডিউল বান্ডলারে (যেমন রোলআপ) কাজ করতে পারে তবে এটি মায়াময়। বন্যে এখনও কোনও ES6 মডিউল বাস্তবায়ন হয়নি, তবে এটি চিরদিনের জন্য সত্য হবে না।

আপনার ভবিষ্যতের স্ব চিত্র করুন, একটি ঝরঝরে নেটিভ ইএস 6 মডিউল বাস্তবায়ন চালানোর চেষ্টা করছেন এবং এটি ES6 স্পষ্টভাবে না করে এমন কিছু করার জন্য ES6 সিনট্যাক্স ব্যবহার করে নিজেকে বড় ব্যর্থতার জন্য প্রস্তুত করেছেন তা সন্ধান করুন

আমি আমার অ-মানক মডিউল লোডারটির সুবিধা নিতে চাই

হতে পারে আপনার কাছে এমন একটি মডিউল লোডার রয়েছে যা "সহায়কভাবে" defaultরফতানি তৈরি করে যখন কোনটিই উপস্থিত না থাকে। আমি বলতে চাইছি, লোকেরা কোনও কারণে মানদণ্ড তৈরি করে তবে মানদণ্ডগুলি উপেক্ষা করা কখনও কখনও মজাদার এবং আমরা ভাবতে পারি যে এটি করার জন্য দুর্দান্ত জিনিস।

MyConsumer.ts এ এতে পরিবর্তন করুন:

import A from './a';

এবং allowSyntheticDefaultImportsকমান্ড-লাইন নির্দিষ্ট করুন বাtsconfig.json বিকল্প ।

মনে রাখবেন যে allowSyntheticDefaultImportsআপনার কোডের রানটাইম আচরণটি মোটেও বদলাবে না। এটি কেবলমাত্র একটি পতাকা যা টাইপস্ক্রিপ্টকে বলে যে আপনার মডিউল লোডার defaultযখন উপস্থিত নেই তখন রফতানি তৈরি করে । এটি আপনার কোডটি নোডেজগুলিতে জাজগতভাবে তৈরি করবে না যখন এটি আগে হয়নি।


কমনজ স্টাইলের জন্য একটি জেন্জ লক্ষ্যমাত্রার প্রয়োজন হয় না? আপনি es6 / es2015 লক্ষ্য করে যখন এই কাজটি করার কোন উপায় আছে?
স্টিভ বুজোনাস

আপনি এটি ES6 লক্ষ্য করে কাজ করতে পারবেন না কারণ এটি ES6 তে কাজ করে না ...
রায়ান ক্যাভনোগ

আমি কি বোঝার ক্ষেত্রে সঠিক হয়েছি যে আমি যদি ES2015 মডিউলগুলি লক্ষ্যবস্তু করছি, তবে কোন কমনজেএস মডিউলটি উল্লেখ করার কোনও উপায় নেই export = MyClass? আমার একমাত্র বিকল্প হ'ল আমার মডিউলটি সেট করা commonjsএবং আধুনিক ইএস ব্যবহার না করে বিশ্বকে আরও খারাপ জায়গায় পরিণত করা চালিয়ে যাওয়া?
মিকাহ জোল্টু

6
ইন 2.7 রিলিজ নোট অধীন --esModuleInterop, এটা বলছেন "আমরা অত্যন্ত এটি উভয় নতুন এবং বিদ্যমান প্রকল্পে আবেদন সুপারিশ"। আমার মতে, এই উত্তর (এবং প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি / নীতি মধ্যে DefinitelyTypedযে লিঙ্ক এখানে) নতুন ভঙ্গি প্রতিফলিত পরিবর্তন করা উচিত নয়।
আলেক মেভ

4
তাই খুব sassy।
jmealy

25

টাইপসক্রিপ্ট ২. নতুন সহায়ক পদ্ধতিগুলি নির্গমন করে সমর্থন প্রবর্তন করেছে: https://www.typescriptlang.org.org / ডকস / হ্যান্ডবুক / রিলিজ- নোটস / টাইপসক্রিপট-7- html#support-for-import-d-from-cjs-for- কমনজস-মডিউলগুলি --- এসমডিউইনটারপ সহ

সুতরাং tsconfig.json এ এই দুটি সেটিংস যুক্ত করুন:

{
    // Enable support for importing CommonJS modules targeting es6 modules
    "esModuleInterop": true,

    // When using above interop will get missing default export error from type check since
    // modules use "export =" instead of "export default", enable this to ignore errors.
    "allowSyntheticDefaultImports": true
}

এবং এখন আপনি ব্যবহার করতে পারেন:

import MyClass from './MyClass';

ব্যবহারের পরিবর্তে esModuleInteropআমি resolveJsonModuleআপনার অন্যান্য পরামর্শের পাশাপাশি ব্যবহার করেছি allowSyntheticDefaultImportsএবং এটি আমার পক্ষে কাজ করে।
এডগার কুইন্টেরো

6

আমার 2 সেন্ট যুক্ত করার সাথে অন্য কারও কাছে সমস্যা নেই যদি এই সমস্যা থাকে।

পরিবর্তন না করে ইস্যুটি সম্পর্কে আমার কাজ করার পদ্ধতি tsconfig.json(যা কিছু প্রকল্পে সমস্যা হতে পারে), আমি অনলাইনে নিয়মটি কেবল অক্ষম করেই চলেছি।

import MC = require('./MyClass'); // tslint:disable-line


5

আমার প্রকল্পে এনপিএম ডেবিউন প্যাকেজ অন্তর্ভুক্ত করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি।

আমি যখন উপরে গৃহীত সমাধানটি চেষ্টা করেছি তখন আমি একটি ব্যতিক্রম পেয়েছিলাম:

ইসমাস্ক্রিপ্ট মডিউলগুলি লক্ষ্য করে যখন আমদানি অ্যাসাইনমেন্ট ব্যবহার করা যায় না। 'মোড' থেকে এনএস হিসাবে 'আমদানি *', 'মোড' থেকে 'আমদানি {এ}', 'মোড' থেকে 'আমদানি ডি' বা অন্য কোনও মডিউল বিন্যাস পরিবর্তে বিবেচনা করুন।

এটি কাজ শেষ করে:

import debounce from 'debounce' 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.