টাইপস্ক্রিপ্টে 'উদাহরণস্বরূপ' আমাকে ত্রুটিটি দেয় কেন "'ফু' কেবল একটি প্রকারকেই বোঝায়, তবে এখানে মান হিসাবে ব্যবহৃত হচ্ছে?"


91

আমি এই কোড লিখেছি

interface Foo {
    abcdef: number;
}

let x: Foo | string;

if (x instanceof Foo) {
    // ...
}

তবে টাইপস্ক্রিপ্ট আমাকে এই ত্রুটি দিয়েছে:

'Foo' only refers to a type, but is being used as a value here.

ইহা কি জন্য ঘটিতেছে? আমি ভেবেছিলাম যে instanceofএটির জন্য আমার মানটির একটি নির্দিষ্ট প্রকার রয়েছে কিনা তা যাচাই করতে পারে তবে টাইপস্ক্রিপ্ট এটি পছন্দ করে না বলে মনে হয়।


@ 4 ক্যাসেলের নীচে উত্তরটি দেখুন। অন্যথায়, আপনি ঠিক বলেছেন, আমি এটি তৈরি করব Foo | string
ড্যানিয়েল রোজনওয়াসার


এবং ভেরিয়েবল টাইপস্ক্রিপ্ট ইউনিয়নের একটি নির্দিষ্ট ইন্টারফেস টাইপ কিনা তা চেকের ডুপ্লিকেট সম্ভব (আমি সত্যিই এটি একা-হাতুড়ি দিয়ে হাতুড়ি দিতে চাই না)
সার্বারাস

@ জেনি ও'রিলি, এখন এটি সম্ভবত একটি সম্ভাব্য সদৃশ সদৃশ!
মার্কাসে

উত্তর:


100

কি হচ্ছে

সমস্যাটি এটি instanceofজাভাস্ক্রিপ্ট থেকে তৈরি এবং জাভাস্ক্রিপ্টে ডানদিকের অপারেন্ডের জন্য instanceofএকটি মান প্রত্যাশা করে । বিশেষত, x instanceof Fooজাভাস্ক্রিপ্টের Foo.prototypeপ্রোটোটাইপ চেইনে কোথাও উপস্থিত রয়েছে কিনা তা দেখার জন্য একটি রানটাইম চেক সঞ্চালন করবে x

তবে, টাইপস্ক্রিপ্টে এসগুলির interfaceকোনও এমিট নেই। তার অর্থ রানটাইমের সময় নেই Fooবা Foo.prototypeবিদ্যমান নেই তাই এই কোডটি অবশ্যই ব্যর্থ হবে।

টাইপস্ক্রিপ্ট আপনাকে বলার চেষ্টা করছে এটি কখনই কাজ করতে পারে নাFooএটি কেবল একটি প্রকার, এটি মোটেই মূল্য নয়!

"এর পরিবর্তে আমি কী করতে পারি instanceof?"

আপনি টাইপ গার্ড এবং ব্যবহারকারী-সংজ্ঞায়িত টাইপ গার্ডগুলিতে সন্ধান করতে পারেন ।

"কিন্তু আমি যদি শুধু একটি থেকে সুইচ কি interface একটি থেকে class?"

আপনি একটি থেকে অন্যটিতে যেতে প্রলুব্ধ করা যেতে পারে interfaceএকটি থেকে class, কিন্তু আপনি টাইপ করা বিষয় এর কাঠামোগত টাইপ সিস্টেমের মধ্যে যে (যেখানে জিনিষ প্রাথমিকভাবে হয় উপলব্ধি করা উচিত ভিত্তিক আকৃতি ), আপনি কোনো একটি বস্তুর একটি প্রদত্ত শ্রেণী হিসেবে একই আকৃতি আছে যা তৈরী করতে পারে:

class C {
    a: number = 10;
    b: boolean = true;
    c: string = "hello";
}

let x = new C()
let y = {
    a: 10, b: true, c: "hello",
}

// Works!
x = y;
y = x;

এই ক্ষেত্রে, আপনার কাছে xএবং yএটি একই ধরণের রয়েছে তবে আপনি যদি instanceofকোনও একটিতে ব্যবহার করার চেষ্টা করেন তবে আপনি অন্যটির বিপরীত ফলাফল পাবেন। সুতরাং আপনি টাইপস্ক্রিপ্টে কাঠামোগত ধরণের সুবিধা নিচ্ছেন তবে প্রকারের সম্পর্কে আপনাকে সত্যিই বেশি কিছু বলবে instanceofনা ।


4
আমার জন্য এটির জন্য আমাকে যুগে যুগে নিয়ে যেত!
ম্যাথু লেটন

সুতরাং মূলত আমি উত্তরটি দিয়ে ধারণাটি পাইনি যা ভাল হয় to ক্লাস? কারণ আপনি এটি বিস্তারিত। তবে আপনি "আপনি প্রলোভিত হতে পারেন" বলে উল্লেখ করার সাথে সাথে বিভ্রান্ত হয়ে পড়েছেন। সুতরাং যদি আমাকে সমস্ত বৈশিষ্ট্য তুলনা করতে হয় এবং কেবল প্রকারের প্রহরীগুলির জন্য ডক্স হিসাবে সম্পত্তি সাঁতার না দিয়ে?
হাফওয়েবদেভ

4
এখানে মূল বক্তব্যটি instanceofইন্টারফেস নয় ক্লাসের সাথে কাজ করে। ভেবেছিলেন যে জোর দেওয়া প্রয়োজন।
অজৈবিক

5

কোনও ইন্টারফেসের সাথে রানটাইমে টাইপ চেকিং করতে টাইপ গার্ড ব্যবহার করা হয় , যদি আপনি যে ইন্টারফেসগুলি পরীক্ষা করতে চান তার বিভিন্ন বৈশিষ্ট্য / ফাংশন থাকে।

উদাহরণ

let pet = getSmallPet();

if ((pet as Fish).swim) {
    (pet as Fish).swim();
} else if ((pet as Bird).fly) {
    (pet as Bird).fly();
}

আমি যদি হাঁস সম্পর্কে জানতে এবং আমার বার্ড ইন্টারফেসে সাঁতার () ফাংশনটি যুক্ত করি তবে কী হবে? প্রতিটি পোষা প্রাণীকে কোনও প্রকারের প্রহরীতে মাছ হিসাবে শ্রেণিবদ্ধ করা হবে না? এবং যদি আমার সাথে তিনটি ফাংশন সহ তিনটি ইন্টারফেস এবং অন্য ইন্টারফেসগুলির সাথে দুটি ওভারল্যাপ হয়?
কাইজ

4
@ কায়েজ যদি এমন বৈশিষ্ট্য / ফাংশন না থাকে যা কোনও ইন্টারফেস স্বতন্ত্রভাবে সনাক্ত করতে পারে তবে আপনি সেগুলি আলাদা করতে পারবেন না। আপনার পোষা প্রাণীটি আসলে একটি হতে পারে Duck, আপনি প্রহরীটি টাইপ করেন এটি হয়ে যায় Fish, তবে আপনি যখন প্রার্থনা করেন তখন রানটাইম ব্যতিক্রম হয় না swim()। পরামর্শ দিন যে আপনি 1 টি সাধারণ ইন্টারফেস (উদাঃ Swimmable) তৈরি করেছেন এবং আপনাকে swim()সেখানে ফাংশন সরিয়ে নিয়েছেন, তারপরে টাইপ গার্ডটি এখনও ভাল দেখাচ্ছে ((pet as Swimmable).swim
লি চি কিম

টাইপকাস্টিং প্রতিরোধ করতে আপনি 'swim' in petশর্তটি ব্যবহার করতে পারেন । এটি এটিকে একটি swimFish | Mammal
সাবসেটে

2

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

তবে x = y নির্ধারণ করা সমান সহজ easy এখন x সি এর উদাহরণ হবে না কারণ y কেবলমাত্র সি এর আকার ধারণ করে had

class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}

let x = new C()
let y = {
    a: 10, b: true, c: "hello",
}

console.log('x is C? ' + (x instanceof C)) // return true
console.log('y is C? ' + (y instanceof C)) // return false

-3

আপনার ফাইলটি সঠিক ধরণের কিনা তা পরীক্ষা করে দেখুন। ট্যাগগুলি js ফাইলগুলিতে অনুমোদিত নয়, তবে জেএসএক্সে অনুমোদিত


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