টাইপস্ক্রিপ্টে "ডিক্লেয়ার ক্লাস" এবং "ইন্টারফেস" এর মধ্যে পার্থক্য কী


116

টাইপস্ক্রিপ্টে .d.ts উত্স ঘোষণার ফাইলগুলি তৈরি করার সময় কোনটি পছন্দনীয় এবং কেন?

declare class Example {
    public Method(): void; 
}

অথবা

interface Example {
    Method(): void;
}

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



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

1
সংক্ষিপ্ত: ঘোষণার সাথে আপনাকে নিশ্চিত করতে হবে যে ক্লাসের বাস্তবায়ন রানটাইমে উপস্থিত রয়েছে যেখানে কোনও ইন্টারফেসের সাথে আপনাকে যা করতে হবে না।
হাকিম

উত্তর:


163

interfaceআপনি যখন কোনও বস্তুর আকৃতিটি বর্ণনা করতে চান কেবল তখনই। ইন্টারফেসের জন্য কোনও কোড জেনারেশন নেই, - এগুলি টাইপ সিস্টেমে কেবলমাত্র একটি শিল্পী। কোনও শ্রেণি আছে কি না তার উপর নির্ভর করে কোনও শ্রেণীর জন্য আপনি কোড জেনারেশনে কোনও পার্থক্য দেখতে পাবেন না implements

declare classআপনি যখন বিদ্যমান ক্লাসটি বর্ণনা করতে চান (সাধারণত একটি টাইপস্ক্রিপ্ট ক্লাস তবে সর্বদা নয়) যা বাহ্যিকভাবে উপস্থিত হতে চলেছে (উদাহরণস্বরূপ, আপনার কাছে দুটি .ts ফাইল রয়েছে যা দুটি .js ফাইলগুলিতে সংকলিত হয় এবং উভয়ই scriptট্যাগের মাধ্যমে অন্তর্ভুক্ত থাকে) একটি ওয়েবপৃষ্ঠায়)। আপনি যদি কোনও classব্যবহার থেকে উত্তরাধিকারী হন extends(বেস টাইপটি declare classএকটি নিয়মিত ছিল কিনা তা নির্বিশেষে class) সংকলক প্রোটোটাইপ চেইন এবং ফরোয়ার্ডিং কনস্ট্রাক্টরগুলি হুক করার জন্য সমস্ত কোড তৈরি করতে চলেছে এবং কী নয়।

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

বিপরীতভাবে, যদি আপনি কেবল implementএকটি ইন্টারফেস ছিল যা একটি হওয়া উচিত ছিল declare class, আপনাকে সমস্ত সদস্যদের নিজেই পুনরায় প্রয়োগ করতে হবে এবং বেস কোড এবং ফাংশনগুলি থেকে কোনও কোড পুনরায় ব্যবহারের সুযোগ নেবেন না won't যেটি রানটাইমের সময় প্রোটোটাইপ চেইনটি পরীক্ষা করে তা আপনার অবজেক্টটিকে বাস্তবে বেস শ্রেণীর উদাহরণ না হিসাবে প্রত্যাখ্যান করে।

সত্যই নার্দি পেতে, আপনার যদি সি ++ ব্যাকগ্রাউন্ড থাকে তবে আপনি প্রায় কোনও কন্সট্রাক্টরের interfaceহিসাবে typedefএবং এই সংকলনের ইউনিটে কোনও সংজ্ঞা কঠোরভাবে সংজ্ঞা না থাকার বিষয়ে ঘোষণা declare classহিসাবে ভাবতে পারেন extern

খাঁটি গ্রাহক পক্ষ থেকে (প্রয়োজনীয় কোড লেখা, নতুন ধরণের যোগ করা নয়), এর মধ্যে একমাত্র পার্থক্য interfaceএবং declare classএটি হ'ল আপনি newকোনও ইন্টারফেস করতে পারবেন না । যাইহোক, আপনি যদি এই extend/ implementপ্রকারগুলির মধ্যে একটির কাছে একটি নতুনভাবে পরিকল্পনা করেন তবে classআপনাকে অবশ্যই একেবারে interfaceএবং এর মধ্যে সঠিকভাবে চয়ন করতে হবে declare class। তাদের মধ্যে একটি মাত্র কাজ করবে will

দুটি নিয়ম যা আপনাকে ভালভাবে পরিবেশন করবে:

  • টাইপটির নামটি কি কনস্ট্রাক্টর ফাংশনটির সাথে প্রান্তিককরণ করা হয় (যা কিছু চালানো যেতে পারে new) যা রানটাইমটিতে আসলে উপস্থিত থাকে (যেমন Date, তবে JQueryStaticতা নয়)? যদি না হয় , আপনি অবশ্যই চানinterface
  • আমি কি অন্য টাইপস্ক্রিপ্ট ফাইল থেকে সংকলিত ক্লাসের সাথে কাজ করছি, বা পর্যাপ্তরকম কিছু? যদি হ্যাঁ , ব্যবহার করুনdeclare class

আপনি আসলে টাইপস্ক্রিপ্টে একটি ইন্টারফেস নতুন করতে পারেন। একমাত্র সীমাবদ্ধতা হ'ল উত্তরাধিকার।
ওলেগ মিহাইলিক

3
আপনি newকোনও ইন্টারফেসের ধরণের অপারেটরকে অনুরোধ করতে পারবেন না । যাইহোক, ইন্টারফেসে স্বাক্ষর তৈরি করতে পারে, যার অর্থ আপনি newইন্টারফেস ধরণের মান হিসাবে অপারেটরকে অনুরোধ করতে পারেন । এটি কীভাবে classকাজ করে তার চেয়ে অনেক আলাদা , যেখানে সেই ধরণের একটি এক্সপ্রেশনের পরিবর্তে রচনার স্বাক্ষরটি টাইপের নামে নিজেই থাকে।
রায়ান কাভানহো

আপনি যদি কোনও ইন্টারফেসে কনস্ট্রাক্টর যুক্ত করার পথে যান তবে শ্রেণীর 'স্ট্যাটিকস' বাদে ইন্টারফেসের কেবলমাত্র সদস্য হওয়া উচিত। কনস্ট্রাক্টর ফাংশনটির ইন্টারফেসটি নির্মিত অবজেক্টের ইন্টারফেসের সাথে একত্রিত করবেন না। আপনি যদি করেন তবে টাইপ সিস্টেমটি নিঃসঙ্গতার অনুমতি দেয়: নতুন (নতুন এক্স ()), যেখানে x: ইন্টারফেস।
জেরেমি বেল

24

আপনি ইন্টারফেস বাস্তবায়ন করতে পারেন:

class MyClass implements Example {
    Method() {

    }
}

যেখানে declare classসিনট্যাক্সটি প্রকৃতপক্ষে বাহ্যিক কোডের জন্য টাইপ সংজ্ঞা যুক্ত করতে ব্যবহৃত হবে যা টাইপস্ক্রিপ্টে লিখিত নেই - তাই বাস্তবায়নটি "অন্য কোথাও" is


সুতরাং আপনি পরামর্শ দিচ্ছেন যে টাইপস্ক্রিপ্টে লিখিত নয় কোড বর্ণনা করার জন্য ডিক্লেয়ার ক্লাস ব্যবহার করা উচিত? আমি যে ক্ষেত্রে অনুমান, কিন্তু jquery.d.ts ফাইলে চেক করা, JQueryStatic দ্বারা বাস্তবায়িত একটি ইন্টারফেস: ঘোষণা Var $: JQueryStatic আমি হবে যদিও এই ঘোষণা বর্গ $ {পাবলিক স্ট্যাটিক ...} হতে
ক্রিস

আমি কেবল এটির জন্যই ভাবতে পারি যদি আপনি না চান লোকেরা ক্লাস বাড়িয়ে তুলতে পারে - ইন্টারফেস ব্যবহারের অর্থ আপনাকে পুরো বাস্তবায়ন সরবরাহ করতে হবে।
ফেন্টন

বোধ হয়। সম্ভবত কারণ ছিল।
ক্রিস

ঠিক আছে, তাই আমি অন্য জেএস লাইব্রেরিতে ঘোষণার দিকে চেষ্টা করছি তাই আমার অবশ্যই স্পষ্টভাবে ঘোষণার প্রয়োজন require কোডটি লাইব্রেরির কয়েকটি ফাংশনে (ক্লাস) স্ট্যাটিক্স ব্যবহার করছে - এখনও পর্যন্ত আমি কোনও ঘোষণার ফাইলে প্রকাশিত কোনও স্থির সম্পত্তি বা পদ্ধতি দেখতে পাইনি। ওহ, এবং আমি নেমস্পেস বা মডিউল ব্যবহার করা উচিত?
জেনসন-বাটন-ইভেন্ট

13

সাধারণ ব্যক্তির শর্তে, ফাইলগুলিতে / ফাইলগুলিতে সংকলকটি বলতে declareব্যবহৃত হয় যে আমাদের কীওয়ার্ডটি সেই পরিবেশে বিদ্যমান থাকতে হবে, এটি বর্তমান ফাইলে সংজ্ঞায়িত না করা হলেও আমাদের প্রত্যাশা করা উচিত । এরপরে ঘোষিত অবজেক্টটি ব্যবহার করার সময় এটি আমাদের ধরণের সুরক্ষার অনুমতি দেবে, কারণ টাইপস্ক্রিপ্ট সংকলকটি এখন জানে যে অন্য কোনও উপাদান সেই পরিবর্তনশীল সরবরাহ করতে পারে।.tsd.tsdeclaring


6

টিএস declareএবং এর interfaceমধ্যে পার্থক্য :

ঘোষণা:

declare class Example {
    public Method(): void; 
}

উপরের কোডে declareটিএস সংকলকটি জানতে দেয় যে কোথাও ক্লাস Exampleঘোষিত হয়েছে। এর অর্থ এই নয় যে ক্লাসটি ম্যাজিকালি অন্তর্ভুক্ত রয়েছে। আপনি যখন প্রোগ্রামার হিসাবে ঘোষিত হন তখন declareকীওয়ার্ডটি উপলব্ধ করার জন্য আপনি দায়বদ্ধ ( কীওয়ার্ড সহ)।

ইন্টারফেস:

interface Example {
    Method(): void;
}

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

উদাহরণস্বরূপ যখন আমাদের নিম্নলিখিত ইন্টারফেস থাকে:

interface test {
  foo: number,
  bar: string,
}

এই ইন্টারফেস প্রকারের মধ্যে আমরা যে অবজেক্টগুলির সংজ্ঞা দিচ্ছি তার ইন্টারফেসের সাথে হুবহু মিলে যাওয়া দরকার:

// perfect match has all the properties with the right types, TS compiler will not complain.
  const obj1: test = {   
    foo: 5,
    bar: 'hey',
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.