টাইপস্ক্রিপ্ট এস 6 আমদানি মডিউল "ফাইল কোনও মডিউল ত্রুটি নয়"


127

আমি এসপি 6 মডিউল সিনট্যাক্স সহ টাইপস্ক্রিপ্ট 1.6 ব্যবহার করছি।

আমার ফাইলগুলি হ'ল:

test.ts:

module App {
  export class SomeClass {
    getName(): string {
      return 'name';
    }
  }
}

main.ts:

import App from './test';

var a = new App.SomeClass();

আমি যখন main.tsফাইলটি সংকলনের চেষ্টা করছি তখন আমি এই ত্রুটিটি পাই:

ত্রুটি TS2306: ফাইল 'test.ts' কোনও মডিউল নয়।

আমি কীভাবে এটি সম্পাদন করতে পারি?


আমার এই সমস্যাটি ছিল, আমার ক্লাসে কোনও কনস্ট্রাক্টর নেই, যোগ করেছেন এবং সমস্যাটি চলে গেল
dorriz

উত্তর:


139

প্রসারিত - কিছু মন্তব্যের ভিত্তিতে আরও বিশদ সরবরাহ করতে

ভূল

ত্রুটি TS2306: ফাইল 'test.ts' কোনও মডিউল নয়।

এখানে বর্ণিত সত্য থেকে আসে http://exploringjs.com/es6/ch_modules.html

17. মডিউল

এই অধ্যায়টি ব্যাখ্যা করে যে ECMAScript 6 এ অন্তর্নির্মিত মডিউলগুলি কীভাবে কাজ করে।

17.1 ওভারভিউ

ECMAScript 6 এ মডিউলগুলি ফাইলগুলিতে সংরক্ষণ করা হয়। প্রতি ফাইল প্রতি এক মডিউল এবং মডিউল প্রতি একটি ফাইল আছে। মডিউল থেকে জিনিস রফতানি করার দুটি উপায় আপনার কাছে রয়েছে। এই দুটি উপায় মিশ্রিত করা যেতে পারে তবে এগুলি পৃথকভাবে ব্যবহার করা ভাল।

17.1.1 একাধিক নামি রফতানি

একাধিক নামযুক্ত রফতানি হতে পারে:

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}
...

17.1.2 একক ডিফল্ট রফতানি

একক ডিফল্ট রফতানি হতে পারে। উদাহরণস্বরূপ, একটি ফাংশন:

//------ myFunc.js ------
export default function () { ··· } // no semicolon!

উপরের ভিত্তিতে exportআমাদের টেস্ট.জেএস ফাইলের অংশ হিসাবে দরকার need আসুন এর বিষয়বস্তু এই মত সামঞ্জস্য করুন:

// test.js - exporting es6
export module App {
  export class SomeClass {
    getName(): string {
      return 'name';
    }
  }
  export class OtherClass {
    getName(): string {
      return 'name';
    }
  }
}

এবং এখন আমরা এই ছুঁড়ে দেওয়া উপায়ে এটি আমদানি করতে পারি:

import * as app1 from "./test";
import app2 = require("./test");
import {App} from "./test";

এবং আমরা এর মতো আমদানি করা জিনিসগুলি গ্রাস করতে পারি:

var a1: app1.App.SomeClass  = new app1.App.SomeClass();
var a2: app1.App.OtherClass = new app1.App.OtherClass();

var b1: app2.App.SomeClass  = new app2.App.SomeClass();
var b2: app2.App.OtherClass = new app2.App.OtherClass();

var c1: App.SomeClass  = new App.SomeClass();
var c2: App.OtherClass = new App.OtherClass();

এবং কার্যটি দেখতে পদ্ধতিটি কল করুন:

console.log(a1.getName())
console.log(a2.getName())
console.log(b1.getName())
console.log(b2.getName())
console.log(c1.getName())
console.log(c2.getName())

আসল অংশটি নেমস্পেসের ব্যবহারে জটিলতার পরিমাণ হ্রাস করতে সহায়তা করার চেষ্টা করছে

আসল অংশ:

আমি সত্যিই দৃ Q়ভাবে এই প্রশ্নোত্তর যাচাই করার পরামর্শ দেব:

আমি টাইপস্ক্রিপ্ট বাহ্যিক মডিউলগুলির সাথে নেমস্পেসগুলি কীভাবে ব্যবহার করব?

আমাকে প্রথম বাক্যটি উদ্ধৃত কর:

বাহ্যিক মডিউলগুলিতে "নেমস্পেস" ব্যবহার করবেন না।

এটি করবেন না।

সিরিয়াসলি। স্টপ।

...

এই ক্ষেত্রে, আমাদের কেবল moduleঅভ্যন্তরের দরকার নেই test.ts। এটি এর সামগ্রীতে সামঞ্জস্য হতে পারে test.ts:

export class SomeClass
{
    getName(): string
    {
        return 'name';
    }
}

এখানে আরও পড়ুন

রফতানি =

পূর্ববর্তী উদাহরণে, আমরা যখন প্রতিটি বৈধকারক গ্রাস করি তখন প্রতিটি মডিউল কেবল একটি মান রফতানি করে। এই জাতীয় ক্ষেত্রে, যখন একটি একক সনাক্তকারী ঠিক পাশাপাশি কাজ করতে পারে তখন তাদের যোগ্য নামের মাধ্যমে এই চিহ্নগুলি নিয়ে কাজ করা জটিল।

export =সিনট্যাক্স নির্দিষ্ট করে একটি একক বস্তু মডিউল থেকে রপ্তানি করা হয় । এটি কোনও শ্রেণি, ইন্টারফেস, মডিউল, ফাংশন বা এনাম হতে পারে। যখন আমদানি করা হয়, রফতানি করা প্রতীকটি সরাসরি গ্রাস করা হয় এবং কোনও নামেই যোগ্য নয়।

আমরা পরে এটির মতো গ্রাস করতে পারি:

import App = require('./test');

var sc: App.SomeClass = new App.SomeClass();

sc.getName();

এখানে আরও পড়ুন:

Ptionচ্ছিক মডিউল লোডিং এবং অন্যান্য উন্নত লোডিং সিনারিও

কিছু ক্ষেত্রে, আপনি কিছু শর্তে কেবলমাত্র একটি মডিউল লোড করতে চাইতে পারেন। টাইপস্ক্রিপ্টে, আমরা এই এবং অন্যান্য উন্নত লোডিং পরিস্থিতিতে বাস্তবায়নের জন্য নীচের চিত্রিত প্যাটার্নটি ব্যবহার করতে পারি টাইপ সুরক্ষা না হারিয়ে মডিউল লোডারগুলিকে সরাসরি অনুরোধ করতে।

সংকলক নির্গত জাভাস্ক্রিপ্টে প্রতিটি মডিউল ব্যবহৃত হয়েছে কিনা তা সনাক্ত করে। মডিউলগুলির জন্য যা কেবলমাত্র টাইপ সিস্টেমের অংশ হিসাবে ব্যবহৃত হয়, কোনও কল কল নির্গত হয় না। অব্যবহৃত রেফারেন্সগুলির এই কুলিংটি একটি ভাল পারফরম্যান্স অপটিমাইজেশন, এবং সেইগুলি মডিউলগুলির alচ্ছিক লোডিংয়েরও অনুমতি দেয়।

প্যাটার্নটির মূল ধারণাটি হ'ল আমদানি আইডি = প্রয়োজনীয় ('...') বিবৃতি আমাদের বাহ্যিক মডিউল দ্বারা উদ্ভাসিত ধরণের অ্যাক্সেস দেয়। মডিউল লোডারটি গতিশীলভাবে (প্রয়োজনীয় মাধ্যমে) ডাকা হয়, নীচে যদি ব্লকগুলিতে প্রদর্শিত হয়। এটি রেফারেন্স-কুলিং অপ্টিমাইজেশানটি উপস্থাপন করে যাতে মডিউলটি কেবল যখন প্রয়োজন হয় তখন লোড হয়। এই প্যাটার্নটি কাজ করার জন্য, এটি গুরুত্বপূর্ণ যে আমদানির মাধ্যমে সংজ্ঞায়িত প্রতীকটি কেবলমাত্র টাইপ পজিশনে ব্যবহার করা হয় (যেমন জাভাস্ক্রিপ্টে যে পদে বের হয় এমন কোনও অবস্থানে নয়)।


1
তবে এটি: আমদানি করা অ্যাপ্লিকেশন = প্রয়োজন ('./ পরীক্ষা'); Es6 মডিউলগুলির সিনট্যাক্স নয়। এটি সাধারণ জেএস। আমি কি এটি এস 6 মডিউল সিনট্যাক্স দিয়ে করতে পারি?
বাজিঙ্গা

@ জেএসআইআউসফুল আপনি জেএস মডিউলগুলি টাইপস্ক্রিপ্ট মডিউলগুলির সাথে মিশানোর চেষ্টা করছেন। আপনার একটি বা অন্য ব্যবহার করা দরকার, উভয়ের মিশ্রণ নয়।
জেজেজে

এই উত্তরটি ES6 সিনট্যাক্সের উল্লেখ করে না
ফিরস্কি

@ ফায়ারস্কি, আপনার অর্থ কী?
Radim Köhler

1
ধন্যবাদ, দুর্দান্ত।
ফিরস্কি

24

উপরের উত্তরগুলি সঠিক। তবে কেবল ক্ষেত্রে ... ভিএস কোডে একই ত্রুটি পেয়েছে। ত্রুটি ছুঁড়ে ফেলা ফাইলটি পুনরায় সংরক্ষণ / পুনরায় সংরক্ষণ করতে হয়েছিল।


2
এটি আমার পক্ষে কাজ করেছে। আমি কেবল একটি আধা-কোলন সরিয়ে নিয়েছি, এটি আবার যুক্ত করেছি এবং ফাইলটি আবারও সংরক্ষণ করেছি এবং তারপরে ওয়েবপ্যাক চালানোর কাজ করেছে। বেঁচে থাকার দুর্দান্ত সময়।
রায় হোগান

1
আমি ওয়েবস্টর্মে অভ্যস্ত এবং বুঝতে পারিনি যে ফাইলগুলি ভিএস কোডে স্বয়ংক্রিয়ভাবে সংরক্ষিত হয় না। এই উত্তরটি আমাকে অনেক যন্ত্রণা বাঁচিয়েছে, ধন্যবাদ।
সিবি

ভিএস কোডে অটো সেভের জন্য একটি সেটিং আছে। আমি এটি ব্যবহার করি না কারণ ভিএস কোড ইতিমধ্যে সংরক্ষিত ফাইলগুলিকে ব্যাক আপ করে এবং আমি সর্বদা গিট ব্যবহার করি না।
এমার্কস

13

আমি কীভাবে এটি সম্পাদন করতে পারি?

আপনার উদাহরণ একটি টাইপস্ক্রিপ্ট <1.5 1.5 অভ্যন্তরীণ মডিউল ঘোষণা করে , যা এখন একটি নামস্থান বলা হয় । পুরানো module App {}বাক্য গঠন এখন সমান namespace App {}। ফলস্বরূপ, নিম্নলিখিত কাজ করে:

// test.ts
export namespace App {
    export class SomeClass {
        getName(): string {
            return 'name';
        }
    }
}

// main.ts
import { App } from './test';
var a = new App.SomeClass();

বলা হচ্ছে যে...

নেমস্পেসগুলি রফতানি এবং পরিবর্তে মডিউলগুলি (যা আগে বাহ্যিক মডিউল বলা হত ) এড়াতে চেষ্টা করুন । যদি প্রয়োজন হয় তবে আপনি এই জাতীয় নাম স্থান আমদানি করার ধরণ সহ আমদানিতে একটি নেমস্পেস ব্যবহার করতে পারেন :

// test.ts
export class SomeClass {
    getName(): string {
        return 'name';
    }
}

// main.ts
import * as App from './test'; // namespace import pattern
var a = new App.SomeClass();

1
এটি এখনও একটি ভাল অনুশীলন? এই উত্তর অনুসারে ( স্ট্যাকওভারফ্লো.com/ a/ 35706271 / 2021224 ), এর মতো কোনও ফাংশন বা শ্রেণি আমদানি করার চেষ্টা করা এবং তারপরে অনুরোধ করা - "ইএস 6 অনুমান অনুসারে অবৈধ"।
আন্দ্রে প্রোখোরভ

2

এ টিমের উত্তর ছাড়াও এমন সময় আসে যখন এমনকি এটি কার্যকর হয় না, তাই আপনার প্রয়োজন:

  1. ইন্টেলিজেন্স ব্যবহার করে আমদানি স্ট্রিংটি পুনরায় লিখুন। কখনও কখনও এটি সমস্যার সমাধান করে
  2. ভিএস কোড পুনরায় চালু করুন

1
স্ট্যাকব্লিটজ-এর জন্য একই - পুনরায় কম্পাইল করা ফাইল যা মডিউলটি আমদানি করে এবং সমস্ত কাজ সূক্ষ্ম করে, চিয়ার্স
Godblessstrawberry

আমার কোডটি সঠিক আকারে ফর্ম্যাট না করা অবস্থায় আমি এটিও অনুভব করেছি। আমি যখন আমার ক্লাসগুলি তাদের নিজস্ব ফাইলে বিভক্ত করছিলাম তখন ভিএসকোড আমার অনুলিপি + পেস্ট ক্লাস কোডটি ইন্টেন্ট করেছিল এবং ভিএসকোডের পরে সবকিছুই ইন্টেন্ট করেছিল export class... {, যা কৌণিক পছন্দ করে না, আমাকে এই সমস্যাটি দিয়েছিল। বিন্যাস ঠিক করার পরে, কোনও সমস্যা ছাড়াই সংকলিত।
গাই পার্ক

0

টিমের উত্তর ছাড়াও, এই সমস্যাটি আমার জন্য তখন ঘটেছিল যখন আমি একটি ফাইলকে রিফ্যাক্টরিং বিভক্ত করছিলাম, এটিকে তাদের নিজের ফাইলে বিভক্ত করেছিলাম।

ভিএসকোড, কোনও কারণে, আমার [শ্রেণি] কোডের ইন্টেন্টেড অংশগুলি, যা এই সমস্যাটির কারণ হয়েছিল। এটি প্রথমে লক্ষ্য করা শক্ত ছিল, কিন্তু আমি কোডটি উদ্বিগ্ন বলে বুঝতে পেরে আমি কোডটি ফর্ম্যাট করে দিয়েছি এবং বিষয়টি অদৃশ্য হয়ে গেছে।

উদাহরণস্বরূপ, ক্লাস সংজ্ঞা প্রথম লাইনের পরে সমস্ত কিছুই পেস্ট চলাকালীন স্বয়ংক্রিয়ভাবে যুক্ত হয়েছিল।

export class MyClass extends Something<string> {
    public blah: string = null;

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