'এক্সপোর্ট ঘোষিত ক্লাস অ্যাকশনস'-এ' ঘোষণা 'কী করবে?


উত্তর:


211

আমি যা খুঁজছিলাম তা পেয়েছি:

বনাম বনাম ঘোষণা করুন

varএকটি নতুন ভেরিয়েবল তৈরি করে। declareটাইপস্ক্রিপ্টটি বলতে ব্যবহার করা হয় যে ভেরিয়েবলটি অন্য কোথাও তৈরি হয়েছে। আপনি যদি ব্যবহার declareকরেন তবে তৈরি হওয়া জাভাস্ক্রিপ্টে কিছুই যুক্ত হয় না - এটি কেবল সংকলকটির ইঙ্গিত।

উদাহরণস্বরূপ, আপনি যদি বাহ্যিক স্ক্রিপ্টটিকে সংজ্ঞায়িত করে থাকেন তবে var externalModuleআপনি ইতিমধ্যে সেটআপ করা declare var externalModuleটাইপস্ক্রিপ্ট সংকলকটিকে ইঙ্গিত করতে ব্যবহার করবেনexternalModule


আমার মধ্যে একটি বহিরাগত জেএসের সাথে externalModuleঅন্যদের মধ্যে একটি চলক সংজ্ঞায়িত করার মত একই দৃশ্য রয়েছে। externalModuleরানটাইমে অপরিজ্ঞাত হওয়ার কারণ কিন্তু অন্যান্য কিছু ভেরিয়েবলের কারণ কী হতে পারে ?
— আলেজান্দ্রো গঞ্জালেজ

93

এটি বুঝতে, আপনাকে প্রথমে "ডিক্লেয়ার" কীওয়ার্ডটি বুঝতে হবে।

এখানে গিল ফিংকের ব্লগ থেকে একটি ভাল ব্যাখ্যা দেওয়া হয়েছে :

টাইপস্ক্রিপ্ট ডিক্লেয়ার কীওয়ার্ডটি ভেরিয়েবলগুলি ঘোষণার জন্য ব্যবহৃত হয় যা কোনও টাইপ স্ক্রিপ্ট ফাইল থেকে উদ্ভূত হয়নি।

উদাহরণস্বরূপ, কল্পনা করতে দিন যে আমাদের মাই লাইব্রারি নামে একটি লাইব্রেরি রয়েছে যাতে টাইপস্ক্রিপ্ট ডিক্লেয়ারেশন ফাইল নেই এবং বিশ্বব্যাপী নেমস্পেসে মাইলিবারি নামে একটি নেমস্পেস রয়েছে। আপনি যদি এই টাইপস্ক্রিপ্ট কোডটিতে লাইব্রেরিটি ব্যবহার করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

declare var myLibrary;

টাইপস্ক্রিপ্ট রানটাইম যে টাইপটি মাই লাইব্রেরি ভেরিয়েবলকে দেবে তা হ'ল টাইপ। এখানে সমস্যাটি হ'ল ডিজাইনের সময়টিতে আপনার চলকটির জন্য ইন্টেলিসেন্স থাকবে না তবে আপনি আপনার কোডটিতে লাইব্রেরিটি ব্যবহার করতে সক্ষম হবেন। ঘোষিত কীওয়ার্ডটি ব্যবহার না করে একই আচরণ করার জন্য অন্য বিকল্পটি হ'ল যে কোনও ধরণের সাথে একটি ভেরিয়েবল ব্যবহার করা:

var myLibrary: any;

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


সুতরাং আপনি "ঘোষিত" কীওয়ার্ডটি বোঝার পরে আপনি যেখানেই খুঁজে পাবেন সেখানে ফিরে যান

export declare class Action{
...
}

শ্রেণীর আসল বাস্তবায়ন সম্ভবত অন্য কোথাও — সম্ভবত একটি .js ফাইল।


2
"উভয় কোড উদাহরণের ফলে একই জাভাস্ক্রিপ্ট আউটপুট আসবে", এটি সত্য নয়: declare var myLibraryকিছুইতে স্থানান্তরিত করবে : টাইপসক্রিপ্টআরএলগ্রাং / প্লে /# code/…
— অ্যাপোলো

38

declare টাইপস্ক্রিপ্টে:

declareটাইপ করা বিষয় মধ্যে শব্দ টাইপ করা বিষয় কম্পাইলার একটি কহন জন্য দরকারী ঘোষণা অন্য কোথাও সংজ্ঞায়িত করা হয় (কোথাও একটি বহিস্থিত জাভাস্ক্রিপ্ট ফাইল বা রানটাইম এনভায়রনমেন্ট অংশ লেখা)।

ধরা যাক আমাদের কাছে foo নামক একটি ভেরিয়েবল অন্য কোথাও ঘোষিত হয়েছে। এরপরে আমরা যখন ভেরিয়েবলটি টাইপস্ক্রিপ্ট সংকলকটি উল্লেখ করার চেষ্টা করি তখন একটি ত্রুটি ঘটায়:

foo = 'random'; // Error: 'foo' is not defined

আমরা declareকীওয়ার্ডটি ব্যবহার করে এই সমস্যাটি সমাধান করতে পারি :

declare var foo: string;
foo = 'random';  // no error anymore

এর নিম্নলিখিত পরিণতি রয়েছে:

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

17

ঘোষণা এই নির্দিষ্ট ক্ষেত্রে মূল শব্দ:

export declare class Actions {
    ...
}

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

টি এল; ডিআর

export declare class Actions {
    ...
}

হিসাবে একই

declare class Actions {
    ...
}

আমি তাদের এক হিসাবে মনে করি না import, আগেরটি ব্যবহার করা উচিত , দ্বিতীয়টি নয়
— ইয়ান ঝং

10

declare - কোনও আমদানি বা রফতানি কীওয়ার্ড ছাড়াই - টাইপস্ক্রিপ্ট দ্বারা স্বয়ংক্রিয়ভাবে গৃহীত ডিক্লারেশন ফাইলগুলি সংজ্ঞায়িত করে, যা লিগ্যাসি মডিউলগুলিতে টাইপ যোগ করার জন্য একটি দরকারী বৈশিষ্ট্য (টাইপস্ক্রিপ্টের সংজ্ঞা ছাড়াই এনপিএম ইনস্টল হওয়া প্যাকেজ)।

import/ exportমডিউলগুলি ব্যবহারের সঠিক উপায় এবং সবকিছু ম্যানুয়ালি করা দরকার (এবং আমি কিছুটা ক্লান্তিকরভাবে খুঁজে পাই) আমদানি করা হয়, এটি যুক্তিযুক্ত, হয় এটির সংজ্ঞা রয়েছে।

ব্যবহারিক ব্যবহারের ক্ষেত্রে export declareআপনাকে সমস্ত উপ-উপাদান রপ্তানি এড়াতে দেয়, যেমন:

export declare namespace Redux {
    namespace Store {
        interface Definition { ... }
    }
}

যা পড়ার চেয়ে সহজ হতে পারে:

export namespace Redux {
    export namespace Store {
        export interface Definition { ... }
    }
}

বাহ্যিক আমদানি উভয় ক্ষেত্রেই সমান (যেমন import { Redux } from 'definitions/redux';), যা আমি জানি না এটি ভাল অনুশীলন কিনা, তবে আমি এটি পরিপাটি মনে করি! ^^

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

পিএস, একটি বাগ রয়েছে ( ইস্যু 16671 ): আপনি const enumযদি নিজের ঘোষণায় ব্যবহার করেন (আমি রিডুএক্স ক্রিয়া টাইপের জন্য এটি করি) এবং আপনি transpileOnlyপতাকাটি নির্দিষ্ট করেছেন ( ক্রিয়েট-রিঅ্যাক্ট -অ্যাপ-টাইপস্ক্রিপ্ট প্যাকেজটি করে, তাই আমি জানি), এনাম ইনলাইন করা হবে না! আপনি এটি চালাতে পারেন, আপনি নাও করতে পারেন, তবে এটি আগে জেনে রাখা দরকারী!


মডিউল Ala ভিতরে নামব্যবধান export namespaceহয় একটি ভাল ধারণা না যোগ অপ্রয়োজনীয় namespacing । সম্পর্কিত export declare, আন্দ্রে পেনার উত্তরটি একবার দেখুন।
— ford04
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.