টাইপস্ক্রিপ্টে শ্রেণীর ধরণের চেক


240

অ্যাকশনস্ক্রিপ্টে, রান অপ-টাইমে টাইপটি অপারেটর ব্যবহার করে পরীক্ষা করা সম্ভব :

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

কোনও ভেরিয়েবল (প্রসারিত বা) কোনও নির্দিষ্ট শ্রেণি বা টাইপস্ক্রিপ্টের সাথে ইন্টারফেস কিনা তা সনাক্ত করা সম্ভব?

ভাষা চশমাটিতে আমি এটি সম্পর্কে কিছুই খুঁজে পাইনি। ক্লাস / ইন্টারফেসের সাথে কাজ করার সময় এটি হওয়া উচিত।

উত্তর:


318

4.19.4 অপারেটর

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

সুতরাং আপনি ব্যবহার করতে পারে

mySprite instanceof Sprite;

মনে রাখবেন যে এই অপারেটরটি অ্যাকশনস্ক্রিপ্টেও রয়েছে কিন্তু এটি আর ব্যবহার করা উচিত নয়:

ক্রিয়াকলাপ বা এক্সপ্রেশন কোনও প্রদত্ত ডেটা টাইপের সদস্য কিনা তা পরীক্ষা করতে আপনাকে অপারেটরটি অ্যাকশনস্ক্রিপ্ট ৩.০-এর জন্য নতুন you অ্যাকশনস্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলিতে, উদাহরণস্বরূপ অপারেটর এই কার্যকারিতাটি সরবরাহ করেছিল তবে অ্যাকশনস্ক্রিপ্ট 3.0.০-তে উদাহরণস্বরূপ ডেটা সদস্যতার জন্য অপারেটরটি পরীক্ষার জন্য ব্যবহার করা উচিত নয়। ম্যানুয়াল টাইপ পরীক্ষার জন্য অপারেটরের পরিবর্তে অপারেটরটি ব্যবহার করা উচিত, কারণ এক্স উদাহরণস্বরূপ y এর অস্তিত্বের জন্য কেবল x এর প্রোটোটাইপ শৃঙ্খলা পরীক্ষা করে (এবং অ্যাকশনস্ক্রিপ্ট 3.0.০ এ, প্রোটোটাইপ চেইনের সম্পূর্ণ চিত্র সরবরাহ করে না উত্তরাধিকারের স্তরক্রম)।

টাইপস্ক্রিপ্টের instanceofভাগ একই সমস্যা। যেহেতু এটি এমন একটি ভাষা যা এখনও এটির বিকাশে রয়েছে আমি আপনাকে এই জাতীয় সুবিধার প্রস্তাব দেওয়ার পরামর্শ দিচ্ছি।

আরো দেখুন:


54

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

টাইপস্ক্রিপ্ট ডক্স থেকে উদাহরণ:

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

আরও দেখুন: https://www.typescriptlang.org/docs/handbook/advanced-tyype.html


29
এটি রানটাইম টাইপচেকিং নয়, এটি কেবল কোনও বস্তুর একটি নির্দিষ্ট সম্পত্তি আছে কিনা তা খতিয়ে দেখছে। এটি ইউনিয়নের ধরণগুলির জন্য দুর্দান্ত হতে পারে তাই এটি এই নির্দিষ্ট ক্ষেত্রে কাজ করে তবে এর মতো সমস্ত কিছুর জন্য "ইসতিঙ্গি" তৈরি করা সত্যিই সম্ভব নয়। এছাড়াও যদি মাছ এবং পাখি উভয় সাঁতার কাটতে পারে তবে আপনি ধ্বংস হয়ে যাবেন। আমি আনন্দিত যে আমি হ্যাক্স ব্যবহার করছি যার একটি নির্ভরযোগ্য টাইপ চেকিং রয়েছে যাতে আপনি করতে পারেন Std.is(pet, Fish)যা ধরণের, ইন্টারফেস ইত্যাদির উপর কাজ করে
মার্ক নোল

4
আমি এই উত্তরটি সহায়ক বলে খুঁজে পেয়েছি তবে আমি মনে করি আপনি এটি আরও কিছুটা সুনির্দিষ্ট হতে পারেন ak isFishনিজেই সম্পৃক্ত যে তৈরি করা হয়, এবং তার শরীরের একটি এক-লাইনের সম্পৃক্ত হতে নেই। এর সুবিধাটি হ'ল কম্পাইলারটি সংকলনের সময় যথাযথ সম্ভাব্য ফাংশনগুলি বুঝতে পারে তবে আপনার অভ্যন্তরের কোডটি isFishরানটাইমে কার্যকর করা হয়। আপনি এমনকি গার্ডের একটি instanceofবিবৃতি থাকতে পারে , উদাহরণস্বরূপ return pet instanceof Fish(ধরে নিচ্ছেন এটি একটি শ্রেণি এবং একটি ইন্টারফেস নয়), তবে এটি অপ্রয়োজনীয় হবে যেহেতু সংকলকটি instanceofসরাসরি বোঝে ।

4
এটিকে "ইউজার ডিফাইনড
জুলিয়ান

@ মার্ককনল এটি আসলে রানটাইম যাচাই করছে তবে টাইপস্ক্রিপ্টে অনুমানযুক্ত ধরণের বিষয়টিও বোঝার ক্ষমতা নিয়ে আসে (অর্থাত: আপনি আমাকে বিশ্বাস করতে পারেন এটি টাইপ এক্স বা ওয়াই হবে কারণ আমি রানটাইমটিতে এটি পরীক্ষা করব)।
ফ্লাভিয়ান ভোলকেন

3
(pet as Fish)Tslinter যেহেতু অভিযোগ করবে সেহেতু আপনি ব্যবহারটি বিবেচনা করতে পারেন (<Fish>pet)Tslint ডক
ব্রায়ান

1

আপনি instanceofএটির জন্য অপারেটরটি ব্যবহার করতে পারেন । এমডিএন থেকে:

উদাহরণস্বরূপ অপারেটর পরীক্ষা করে যে কোনও বস্তুর প্রোটোটাইপ শৃঙ্খলে কোনও কনস্ট্রাক্টরের প্রোটোটাইপ বৈশিষ্ট্য উপস্থিত রয়েছে কিনা।

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

    class Animal {
        name;
    
        constructor(name) {
            this.name = name;
        }
    }
    
    const animal = new Animal('fluffy');
    
    // true because Animal in on the prototype chain of animal
    console.log(animal instanceof Animal); // true
    // Proof that Animal is on the prototype chain
    console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
    
    // true because Object in on the prototype chain of animal
    console.log(animal instanceof Object); 
    // Proof that Object is on the prototype chain
    console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
    
    console.log(animal instanceof Function); // false, Function not on prototype chain
    
    

এই উদাহরণে প্রোটোটাইপ চেইনটি হ'ল:

প্রাণী> প্রাণী.প্রোটোটাইপ> অবজেক্ট.প্রোটোটাইপ

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