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


233

আমার কিছু কোড আছে:

baseTypes.ts

export namespace Living.Things {
  export class Animal {
    move() { /* ... */ }
  }
  export class Plant {
    photosynthesize() { /* ... */ }
  }
}

dog.ts

import b = require('./baseTypes');

export namespace Living.Things {
  // Error, can't find name 'Animal', ??
  export class Dog extends Animal {
    woof() { }
  }
}

tree.ts

// Error, can't use the same name twice, ??
import b = require('./baseTypes');
import b = require('./dogs');

namespace Living.Things {
  // Why do I have to write b.Living.Things.Plant instead of b.Plant??
  class Tree extends b.Living.Things.Plant {

  }
}

এই সব খুব বিভ্রান্তিকর। আমি একগুচ্ছ বাহ্যিক মডিউলগুলি একই নামস্থানে সমস্ত ধরনের অবদান রাখতে চাই Living.Things। দেখে মনে হচ্ছে এটি মোটেও কাজ করে না - আমি দেখতে পাচ্ছি Animalনা dogs.ts। আমি পূর্ণ নামস্থান নাম লিখতে হবে b.Living.Things.Plantমধ্যে tree.ts। ফাইল জুড়ে একই নামের জায়গায় একাধিক বস্তু একত্রিত করার জন্য এটি কাজ করে না। আমি এটা কিভাবে করবো?

উত্তর:


859

ক্যান্ডি কাপ সাদৃশ্য

সংস্করণ 1: প্রতিটি ক্যান্ডির জন্য একটি কাপ

ধরা যাক আপনি এই জাতীয় কিছু কোড লিখেছেন:

Mod1.ts

export namespace A {
    export class Twix { ... }
}

Mod2.ts

export namespace A {
    export class PeanutButterCup { ... }
}

Mod3.ts

export namespace A {
     export class KitKat { ... }
}

আপনি এই সেটআপটি তৈরি করেছেন: এখানে চিত্র বর্ণনা লিখুন

প্রতিটি মডিউল (কাগজের পত্রক) এর নিজস্ব কাপের নাম পান A। এটি অকেজো - আপনি এখানে আপনার ক্যান্ডিটি আসলেই সংগঠিত করছেন না , আপনি কেবল নিজের এবং চিকিত্সার মধ্যে একটি অতিরিক্ত পদক্ষেপ (এটি কাপ থেকে বের করে) যোগ করছেন।


সংস্করণ 2: বিশ্ব কাপে এক কাপ

আপনি যদি মডিউল ব্যবহার না করে থাকেন তবে আপনি এই জাতীয় কোড লিখতে পারেন ( exportঘোষণার অভাবটি নোট করুন ):

global1.ts

namespace A {
    export class Twix { ... }
}

global2.ts

namespace A {
    export class PeanutButterCup { ... }
}

global3.ts

namespace A {
     export class KitKat { ... }
}

এই কোডটি Aবিশ্বব্যাপী সুযোগে মার্জড নেমস্পেস তৈরি করে :

এখানে চিত্র বর্ণনা লিখুন

এই সেটআপটি কার্যকর, তবে মডিউলগুলির ক্ষেত্রে প্রয়োগ হয় না (কারণ মডিউলগুলি বিশ্বব্যাপী সুযোগকে দূষিত করে না)।


সংস্করণ 3: কাপলেস যাচ্ছে

মূল উদাহরণ ফিরে যাওয়া, কাপ A, Aএবং Aযদি আপনার কোন অবদানকে করছেন না। পরিবর্তে, আপনি কোডটি লিখতে পারেন:

Mod1.ts

export class Twix { ... }

Mod2.ts

export class PeanutButterCup { ... }

Mod3.ts

export class KitKat { ... }

এমন দেখতে একটি ছবি তৈরি করতে:

এখানে চিত্র বর্ণনা লিখুন

অনেক ভাল!

এখন, আপনি যদি এখনও আপনার মডিউলগুলির সাথে नेम স্পেসটি কতটা ব্যবহার করতে চান তা নিয়ে ভাবছেন, পড়ুন ...


আপনি যে সন্ধান করছেন সেগুলি এই নয়

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

সংগঠন : নেমস্পেসগুলি যুক্তিযুক্ত-সম্পর্কিত বস্তু এবং ধরণের একসাথে গ্রুপিংয়ের জন্য কার্যকর। উদাহরণস্বরূপ, সি # তে আপনি সমস্ত সংগ্রহের প্রকারের সন্ধান করতে যাচ্ছেন System.Collections। শ্রেণিবদ্ধ নেমস্পেসে আমাদের প্রকারগুলি সংগঠিত করে, আমরা এই ধরণের ব্যবহারকারীদের জন্য একটি ভাল "আবিষ্কার" অভিজ্ঞতা সরবরাহ করি।

নামের দ্বন্দ্ব : নাম সংঘর্ষগুলি এড়ানোর জন্য নেমস্পেসগুলি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, আপনার My.Application.Customer.AddFormএবং My.Application.Order.AddFormএকই নাম সহ দুটি ধরণের থাকতে পারে , তবে একটি পৃথক নেমস্পেস। এমন একটি ভাষায় যেখানে সমস্ত শনাক্তকারক একই মূল স্কোপে উপস্থিত থাকে এবং সমস্ত সভাগুলি সমস্ত প্রকারের বোঝা চাপায়, সমস্ত কিছু একটি স্থানের মধ্যে থাকা সমালোচনা।

এই কারণগুলি কি বাহ্যিক মডিউলগুলিতে অর্থবোধ করে?

সংস্থা : বাহ্যিক মডিউলগুলি ইতিমধ্যে একটি ফাইল সিস্টেমে উপস্থিত রয়েছে। আমাদের সেগুলি পথ এবং ফাইলের নাম দিয়ে সমাধান করতে হবে, সুতরাং আমাদের ব্যবহারের জন্য একটি যৌক্তিক সংস্থা পরিকল্পনা রয়েছে। আমরা এটিতে /collections/generic/একটি listমডিউল সহ একটি ফোল্ডার রাখতে পারি।

নাম দ্বন্দ্ব : এটি বাহ্যিক মডিউলগুলিতে মোটেই প্রযোজ্য নয়। মধ্যে একটি মডিউল দেখবেন, সেখানে একই নামের দুটি বস্তুর আছে কোন বিশ্বাসযোগ্য কারণ আছে। ব্যবহারের দিক থেকে, প্রদত্ত যে কোনও মডিউলটির গ্রাহক নামটি চয়ন করতে পারেন যা তারা মডিউলটি উল্লেখ করতে ব্যবহার করবেন, তাই দুর্ঘটনাজনিত নামকরণের বিরোধগুলি অসম্ভব।


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

বক্সগুলিতে বক্সগুলিতে বক্সগুলি

একটি গল্প:

আপনার বন্ধু বব আপনাকে কল করেছে। "আমার বাড়িতে একটি নতুন নতুন সংস্থার স্কিম রয়েছে", তিনি বলেন, "আসুন এটি পরীক্ষা করে দেখুন!"! ঝরঝরে, আসুন দেখি বব কী নিয়ে এসেছেন।

আপনি রান্নাঘর থেকে শুরু এবং প্যান্ট্রি খুলুন। এখানে 60 টি আলাদা বাক্স রয়েছে, যার প্রত্যেকটিতে "প্যান্ট্রি" লেবেল রয়েছে। আপনি এলোমেলোভাবে একটি বাক্স বাছুন এবং এটি খুলুন। ভিতরে "গ্রানস" লেবেলযুক্ত একটি একক বাক্স রয়েছে। আপনি "দানা" বাক্সটি খুলুন এবং "পাস্তা" লেবেলযুক্ত একটি একক বাক্স পাবেন। আপনি "পাস্তা" বক্সটি খুলুন এবং "Penne" লেবেলযুক্ত একটি একক বাক্স খুঁজে পাবেন। আপনি এই বাক্সটি খুলুন এবং আপনি যেমন প্রত্যাশা করছেন, পেন পাস্তা একটি ব্যাগ খুঁজে পাবেন।

কিছুটা বিভ্রান্ত হয়ে আপনি একটি সংলগ্ন বক্স বাছাই করুন, "পেন্ট্রি" লেবেলযুক্ত। ভিতরে একটি একক বাক্স, আবার "শস্য" লেবেলযুক্ত। আপনি "দানা" বাক্সটি খুলুন এবং আবার "পাস্তা" লেবেলযুক্ত একটি একক বাক্স খুঁজে পান। আপনি "পাস্তা" বাক্সটি খুলুন এবং একটি একক বাক্স খুঁজে পান, এটির একটিটিকে "রিগাটোনি" লেবেলযুক্ত। আপনি এই বাক্সটি খুলুন এবং সন্ধান করুন ... রিগাতনি পাস্তা একটি ব্যাগ।

"দারুণ!" বব বলেছেন। "সবকিছুই একটি নামস্থানে!"।

"তবে বব ..." আপনি উত্তর দিন। "আপনার সংস্থার স্কিমটি অকেজো anything কিছু পেতে আপনাকে একটি গুচ্ছ বাক্স খুলতে হবে এবং আপনি কেবল তিনটির পরিবর্তে একটি বাক্সে সবকিছু রেখে দিলে কিছুই খুঁজে পাওয়া আরও সহজতর কিছু নয় fact বাস্তবে, যেহেতু আপনার প্যান্ট্রি ইতিমধ্যে শেল্ফ-বাই-শেল্ফ সাজানো হয়েছে, আপনার বাক্সগুলির একেবারেই দরকার নেই। কেন কেবল তাককে পাস্তা সেট করবেন না এবং যখন আপনার প্রয়োজন হবে তখন এটি বাছাই করবেন না কেন? "

"আপনি বুঝতে পারছেন না - আমার এটি নিশ্চিত করা দরকার যে 'প্যান্ট্রি' নামস্থানের অন্তর্ভুক্ত নয় এমন অন্য কোনও জিনিস যাতে কেউ রাখে না And এবং আমি আমার সমস্ত পাস্তা নিরাপদে নেমস্পেসে সংগঠিত করেছি Pantry.Grains.Pastaযাতে আমি সহজেই এটি খুঁজে পেতে পারি" "

বব খুব বিভ্রান্ত মানুষ।

মডিউলগুলি তাদের নিজস্ব বাক্স

বাস্তব জীবনে আপনার অনুরূপ কিছু ঘটেছে সম্ভবত: আপনি অ্যামাজনে কয়েকটি জিনিস অর্ডার করেন এবং প্রতিটি আইটেমটি তার নিজস্ব বাক্সে প্রদর্শিত হয় যার ভিতরে একটি ছোট বাক্স থাকে এবং আপনার আইটেমটি তার নিজস্ব প্যাকেজিংয়ে আবৃত থাকে। এমনকি অভ্যন্তর বাক্সগুলি সমান হলেও শিপমেন্টগুলি দরকারীভাবে "সংযুক্ত" হয় না।

বাক্সের সাদৃশ্যটি নিয়ে গিয়ে মূল পর্যবেক্ষণটি হ'ল বাহ্যিক মডিউলগুলি তাদের নিজস্ব বাক্স । এটি প্রচুর কার্যকারিতা সহ খুব জটিল আইটেম হতে পারে তবে প্রদত্ত যে কোনও বাহ্যিক মডিউলটি তার নিজস্ব বাক্স।


বাহ্যিক মডিউলগুলির জন্য গাইডেন্স

এখন আমরা বুঝতে পেরেছি যে আমাদের 'নেমস্পেস' ব্যবহার করার দরকার নেই, আমাদের মডিউলগুলি কীভাবে সাজানো উচিত? কিছু গাইডিং নীতি এবং উদাহরণ অনুসরণ করে।

যতটা সম্ভব শীর্ষ-স্তরের কাছাকাছি রফতানি করুন

  • আপনি যদি কেবল একটি একক শ্রেণি বা ফাংশন রফতানি করেন তবে ব্যবহার করুন export default:

MyClass.ts

export default class SomeType {
  constructor() { ... }
}

MyFunc.ts

function getThing() { return 'thing'; }
export default getThing;

খরচ

import t from './MyClass';
import f from './MyFunc';
var x = new t();
console.log(f());

এটি ভোক্তাদের জন্য সর্বোত্তম। তারা আপনার টাইপটিকে তারা যা tখুশি নাম দিতে পারে ( এই ক্ষেত্রে) এবং আপনার অবজেক্টগুলি সন্ধানের জন্য কোনও বহিরাগত বিন্দু করতে হবে না।

  • আপনি যদি একাধিক বস্তু রফতানি করেন তবে এগুলি সমস্ত শীর্ষ স্তরে রাখুন:

MyThings.ts

export class SomeType { ... }
export function someFunc() { ... }

খরচ

import * as m from './MyThings';
var x = new m.SomeType();
var y = m.someFunc();
  • আপনি যদি বিপুল সংখ্যক জিনিস রফতানি করেন তবে কেবল আপনার module/ namespaceকীওয়ার্ডটি ব্যবহার করা উচিত :

MyLargeModule.ts

export namespace Animals {
  export class Dog { ... }
  export class Cat { ... }
}
export namespace Plants {
  export class Tree { ... }
}

খরচ

import { Animals, Plants} from './MyLargeModule';
var x = new Animals.Dog();

লাল পতাকাগুলো

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

  • এমন একটি ফাইল যার একমাত্র শীর্ষ-স্তরের ঘোষণা export module Foo { ... }( Fooসমস্ত কিছুকে একটি স্তরকে সরান এবং সরান)
  • একটি ফাইল যা একটি একক export classবা export functionএটি নাexport default
  • একাধিক ফাইলের export module Foo {শীর্ষ স্তরে একই রয়েছে (এমনটি ভাববেন না যে এগুলি একের সাথে সংযুক্ত হতে চলেছে Foo!)

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

12
কেউ এটি কতটুকু চাইুক না কেন, এটি এখনও সম্ভব নয়
রায়ান কাভানফ

26
আমি বুঝতে পারি না, আমরা আর পাস্কেল লিখছি না। যেহেতু যাওয়ার সময় ফাইল সিস্টেমটি ব্যবহার করে সংগঠিত হচ্ছে?
ডেভিড

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

13
দুর্দান্ত লেখার জন্য, আপনাকে ধন্যবাদ। আমার মনে হচ্ছে আপনার www.typescriptlang.org/docs/handbook/namespaces.html থেকে লিঙ্ক করা উচিত। আমি অবশ্যই টাইপস্ল্যাং.আরএলগ্র্যাং লিঙ্কটি 3 বা 4 বার পড়েছি এবং সি # ডেভ হিসাবে আমি স্বাভাবিকভাবেই সবকিছুকে একটি নেমস্পেসে রাখতে চাই। আমি কিছু প্রস্তাবগুলি না পড়ে বলেছিলাম, তবে কেন এবং কেন এটি নির্দিষ্ট (এবং ভালভাবে বর্ণিত) হিসাবে কিছুই নেই তার কোনও ব্যাখ্যা ছাড়াই। প্লাস টাইপ
স্ক্রিপ্ট নথিতে

53

রায়ান এর উত্তরের সাথে কিছু ভুল হয়নি, তবে যারা ES6 নামস্থান সঠিকভাবে ব্যবহার করার সময় প্রতি-ফাইলের জন্য এক-শ্রেণীর কাঠামো বজায় রাখবেন তা সন্ধান করতে এখানে আসা লোকেরা দয়া করে মাইক্রোসফ্টের এই সহায়ক সংস্থানটি দেখুন।

ডকটি পড়ার পরে আমার কাছে অস্পষ্ট একটি জিনিস হ'ল কীভাবে সম্পূর্ণ (একীভূত) মডিউলটি একটি একক দিয়ে আমদানি করতে হয় import

এই উত্তরটি আপডেট করতে আবার চক্কর সম্পাদনা করুন । টিএস-তে নেমস্পেসিংয়ের কয়েকটি পন্থা উদ্ভূত।

একটি ফাইলে সমস্ত মডিউল ক্লাস।

export namespace Shapes {
    export class Triangle {}
    export class Square {}      
}

নেমস্পেসে ফাইলগুলি আমদানি করুন এবং পুনরায় সাইন করুন

import { Triangle as _Triangle } from './triangle';
import { Square as _Square } from './square';

export namespace Shapes {
  export const Triangle = _Triangle;
  export const Square = _Square;
}

ব্যারেল

// ./shapes/index.ts
export { Triangle } from './triangle';
export { Square } from './square';

// in importing file:
import * as Shapes from './shapes/index.ts';
// by node module convention, you can ignore '/index.ts':
import * as Shapes from './shapes';
let myTriangle = new Shapes.Triangle();

একটি চূড়ান্ত বিবেচনা। আপনি প্রতিটি ফাইলের নাম স্থান দিতে পারে

// triangle.ts
export namespace Shapes {
    export class Triangle {}
}

// square.ts
export namespace Shapes {
    export class Square {}
}

তবে একই নামস্থান থেকে কেউ দুটি ক্লাস আমদানি করার সাথে সাথে টিএস অভিযোগ করবে যে একটি সদৃশ শনাক্তকারী রয়েছে। এই সময়টির একমাত্র সমাধান হ'ল তারপরে নাম স্থানটি to

import { Shapes } from './square';
import { Shapes as _Shapes } from './triangle';

// ugh
let myTriangle = new _Shapes.Shapes.Triangle();

এই এলিয়াসিং একেবারে ঘৃণ্য, তাই এটি করবেন না। আপনি উপরোক্ত পদ্ধতির সাথে ভাল হন। ব্যক্তিগতভাবে, আমি 'ব্যারেল' পছন্দ করি।


6
"ES6 নেমস্পেস" কি?
আলুয়ান হাদাদাদ

@ অ্যালুয়ানহাদাদ এস এস ২০১৫ + আমদানি করার সময়, আমদানি করা জিনিসগুলি হয় পূর্বনির্ধারিত, কাঠামোগত বা নেমস্পিড। const fs = require('fs'), fsনামস্থান। import * as moment from 'moment', momentনামস্থান। এটি অনটোলজি, স্পেসিফিকেশন নয়।
জেফটোপিয়া

আমি এটি সম্পর্কে অবহিত তবে আপনি আপনার উত্তরে এটি ব্যাখ্যা করতে ভাল করবেন। ES6 নামের স্থানগুলি আসলে একটি জিনিস, তবে, requireউদাহরণটি বিভিন্ন কারণে তাদের জন্য প্রযোজ্য নয়, ES6 নামের স্থানগুলি কল নাও হতে পারে, এবং এমন requireএকটি সরল বস্তু দেয় যা ভালভাবে কলযোগ্য হতে পারে returns
আলুয়ান হাদাদাদ

1
আমি অনুসরণ করি না, কারণ আমদানি করা জিনিস কলযোগ্য কিনা তা এখনও যুক্তিযুক্তভাবে কথা বলার মতো একটি নামস্থান হিসাবে কাজ করে । আমি মনে করি না যে সাবধানবাতিগুলি আমার উপরের উত্তরের উপাদান।
জেফটপিয়া

7

ফোল্ডার দ্বারা সংগঠিত করার চেষ্টা করুন:

baseTypes.ts

export class Animal {
    move() { /* ... */ }
}

export class Plant {
    photosynthesize() { /* ... */ }
}

dog.ts

import b = require('./baseTypes');

export class Dog extends b.Animal {
    woof() { }
}   

tree.ts

import b = require('./baseTypes');

class Tree extends b.Plant {
}

LivingThings.ts

import dog = require('./dog')
import tree = require('./tree')

export = {
    dog: dog,
    tree: tree
}

main.ts

import LivingThings = require('./LivingThings');
console.log(LivingThings.Tree)
console.log(LivingThings.Dog)

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


8
লিভিংথিংস.ডগ.ডগ আপনার এখানে যা আছে।
কোরি অ্যালিক্স

আমি চিঠির ক্ষেত্রে ধারাবাহিক রাখার পরামর্শ দিচ্ছি, যদি আপনি "গাছ" রফতানি করেন তবে "গাছ" নয়, "গাছ" আমদানি করুন।
ডেমিম্যাক্স

1
এছাড়াও, tree.tsযখন এর কোনও রফতানি সদস্য নেই তার থেকে আপনি কীভাবে আমদানি করতে পারেন ?
ডেমিসেক্স

ম্যান টিএস নিশ্চিতর সাথে কিছু বিবৃতিযুক্ত পুরানো বাক্য গঠন রয়েছে, যেমন importএবং requireএকসাথে এক বিবৃতিতে।
অ্যান্ডি

3

অ্যালবিনোফ্রান্সির উত্তরটির ছোট্ট ইমপ্লোভমেন্ট:

base.ts

export class Animal {
move() { /* ... */ }
}

export class Plant {
  photosynthesize() { /* ... */ }
}

dog.ts

import * as b from './base';

export class Dog extends b.Animal {
   woof() { }
} 

things.ts

import { Dog } from './dog'

namespace things {
  export const dog = Dog;
}

export = things;

main.ts

import * as things from './things';

console.log(things.dog);

2
এর জন্য ধন্যবাদ! কেবলমাত্র এটি বলতে চেয়েছিলেন যে একটি বিদ্যমান উত্তরের পরিবর্তনগুলি নতুন উত্তর হিসাবে পোস্ট করা উচিত নয়: তাদের হয় হয় বিদ্যমান উত্তরের মন্তব্য হিসাবে যুক্ত করা উচিত, বা (আরও ভাল) আপনি যে উত্তরটি চান তা সম্পাদনার পরামর্শ দিয়ে পরামর্শ দেওয়া উচিত উন্নত।
a3nm

3

ওপি আমি তোমার সাথে আছি আবারও, 300+ আপ ভোট দিয়ে এই উত্তরটিতে কোনও ভুল নেই, তবে আমার অভিমত:

  1. তাদের স্বাচ্ছন্দ্যময় উষ্ণ নিজস্ব ফাইলগুলিতে স্বতন্ত্রভাবে ক্লাস স্থাপনে কী ভুল? আমি বোঝাতে চাইছি এটি কি জিনিসগুলি আরও ভাল দেখায়? (বা কেউ সমস্ত মডেলের জন্য 1000 লাইনের ফাইলের মতো)

  2. সুতরাং, যদি প্রথমটি অর্জন করা হয়, আমাদের আমদানি আমদানি করতে হবে ... কেবলমাত্র প্রতিটি মডেল ফাইলের মধ্যে আমদানি করতে হবে যেমন মানুষ, srsly, একটি মডেল ফাইল, একটি .d.ts ফাইল, কেন এতগুলি *? সেখানে আছে? এটি কেবল সহজ, পরিপাটি হওয়া উচিত এবং এটিই। আমার কেন সেখানে আমদানি দরকার? কেন? সি # একটি কারণে নেমস্পেস পেয়েছে।

  3. এবং ততক্ষণে আপনি আক্ষরিকভাবে "ফাইলনামস.টি" সনাক্তকারী হিসাবে ব্যবহার করছেন। সনাক্তকারী হিসাবে ... এখনই এর 2017 এ আসুন এবং আমরা এখনও তা করি? চিত্রটি মঙ্গল গ্রহে ফিরে যায় এবং আরও 1000 বছর ঘুমায়।

তাই দুঃখের সাথে আমার উত্তরটি: হ্যাঁ, আপনি যদি এই সমস্ত আমদানি ব্যবহার না করেন বা সেই ফাইল নামগুলি সনাক্তকারী হিসাবে ব্যবহার না করেন (যা আমি সত্যই নির্বোধ বলে মনে করি) তবে আপনি "নেমস্পেস" জিনিসটি কার্যকর করতে পারবেন না। অন্য বিকল্পটি হ'ল: এই সমস্ত নির্ভরতা ফাইলমেন্যাসিফায়ারফিট.এসস নামে একটি বাক্সে রাখুন এবং ব্যবহার করুন

export namespace(or module) boxInBox {} .

এগুলি মুড়ে রাখুন যাতে তারা অন্য নামের সাথে একই নামে অ্যাক্সেস করার চেষ্টা করবে না যখন তারা কেবল ক্লাস থেকে সরাসরি শীর্ষে বসে একটি রেফারেন্স পাওয়ার চেষ্টা করছে।


3

আমি এই বিষয়টির চারপাশে দেখেছি এমন বেশিরভাগ প্রশ্ন / মন্তব্য আমার কাছে মনে হয়েছে যেন সেই ব্যক্তিটি Namespaceযেখানে ব্যবহার করছেন তার অর্থ 'মডিউল ওরফে'। রায়ান কাভানফ তার মন্তব্যে একটি হিসাবে উল্লেখ করেছেন যে আপনি একটি 'র্যাপার' মডিউলটি বেশ কয়েকটি মডিউল পুনরায় রফতানি করতে পারেন।

আপনি যদি সত্যই এটি সমস্ত একই মডিউল নাম / উপনাম থেকে আমদানি করতে চান তবে আপনার একটি পথের ম্যাপিংয়ের সাথে একটি মোড়কের মডিউলটি একত্রিত করুন tsconfig.json

উদাহরণ:

./path/to/CompanyName.Products/Foo.ts

export class Foo {
    ...
}


./path/to/CompanyName.Products/Bar.ts

export class Bar {
    ...
}


./path/to/CompanyName.Products/index.ts

export { Foo } from './Foo';
export { Bar } from './Bar';



tsconfig.json

{
    "compilerOptions": {
        ...
        paths: {
            ...
            "CompanyName.Products": ["./path/to/CompanyName.Products/index"],
            ...
        }
        ...
    }
    ...
}



main.ts

import { Foo, Bar } from 'CompanyName.Products'

দ্রষ্টব্য : আউটপুট .js ফাইলগুলিতে মডিউল রেজোলিউশনটি কোনওভাবে হ্যান্ডেল করা দরকার যেমন এই https://github.com/tleunen/babel-plugin-module-resolver সহ

.babelrcউপনাম রেজোলিউশন হ্যান্ডেল করার উদাহরণ :

{
    "plugins": [
        [ "module-resolver", {
            "cwd": "babelrc",
            "alias": {
                "CompanyName.Products": "./path/to/typescript/build/output/CompanyName.Products/index.js"
            }
        }],
        ... other plugins ...
    ]
}

1

এই নেমস্পেস মডিউলটি ব্যবহার করে দেখুন

namespaceModuleFile.ts

export namespace Bookname{
export class Snows{
    name:any;
    constructor(bookname){
        console.log(bookname);
    }
}
export class Adventure{
    name:any;
    constructor(bookname){
        console.log(bookname);
    }
}
}





export namespace TreeList{
export class MangoTree{
    name:any;
    constructor(treeName){
        console.log(treeName);
    }
}
export class GuvavaTree{
    name:any;
    constructor(treeName){
        console.log(treeName);
    }
}
}

bookTreeCombine.ts

--- সংকলন অংশ ---

import {Bookname , TreeList} from './namespaceModule';
import b = require('./namespaceModule');
let BooknameLists = new Bookname.Adventure('Pirate treasure');
BooknameLists = new Bookname.Snows('ways to write a book'); 
const TreeLis = new TreeList.MangoTree('trees present in nature');
const TreeLists = new TreeList.GuvavaTree('trees are the celebraties');

0

dog.ts

import b = require('./baseTypes');

export module Living.Things {
    // Error, can't find name 'Animal', ??
    // Solved: can find, if properly referenced; exporting modules is useless, anyhow
    export class Dog extends b.Living.Things.Animal {
        public woof(): void {
            return;
        }
    }
}

tree.ts

// Error, can't use the same name twice, ??
// Solved: cannot declare let or const variable twice in same scope either: just use a different name
import b = require('./baseTypes');
import d = require('./dog');

module Living.Things {
    // Why do I have to write b.Living.Things.Plant instead of b.Plant??
    class Tree extends b.Living.Things.Plant {
    }
}

-1

আপনার কোডটি সংগঠিত করার সঠিক উপায় হ'ল নাম স্থানের জায়গায় পৃথক ডিরেক্টরি ব্যবহার করা use প্রতিটি শ্রেণি তার নিজস্ব ফাইলের সাথে এটি সম্পর্কিত নেমস্পেস ফোল্ডারে থাকবে। index.ts কেবলমাত্র প্রতিটি ফাইল পুনরায় রফতানি করবে; কোন প্রকৃত কোড সূচী ফাইলের মধ্যে থাকা উচিত। আপনার কোডটিকে এভাবে সংগঠিত করা নেভিগেট করা আরও সহজ করে তোলে এবং ডিরেক্টরি কাঠামোর ভিত্তিতে স্ব-ডকুমেন্টিং।

// index.ts
import * as greeter from './greeter';
import * as somethingElse from './somethingElse';

export {greeter, somethingElse};

// greeter/index.ts
export * from './greetings.js';
...

// greeter/greetings.ts
export const helloWorld = "Hello World";

আপনি এটির পরে এটি ব্যবহার করবেন:

import { greeter } from 'your-package'; //Import it like normal, be it from an NPM module or from a directory.
// You can also use the following syntax, if you prefer:
import * as package from 'your-package';

console.log(greeter.helloWorld);

এটি বিভ্রান্তিকর এবং একেবারে ভুল। নামস্থানগুলি কীভাবে কাজ করে তা তা নয়। এছাড়াও এটি অপ্স প্রশ্নের উত্তর দেয় না।
অ্যান্ড্রুএমসিএলাগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.