'যে কোনও' বনাম 'অবজেক্ট'


209

আমি টাইপস্ক্রিপ্ট কোডটি দেখছি এবং লক্ষ্য করেছি যে তারা ব্যবহার করছে:

interface Blablabla {

   field: Object;

}

Objectবনাম ব্যবহার করে কী সুবিধা হবে any:

interface Blablabla {

  field: any;

}

উত্তর:


202

Objectএর চেয়ে বেশি সীমাবদ্ধ any। উদাহরণ স্বরূপ:

let a: any;
let b: Object;

a.nomethod(); // Transpiles just fine
b.nomethod(); // Error: Property 'nomethod' does not exist on type 'Object'.

Objectবর্গ একটি নেই nomethod()ফাংশন, তাই transpiler আপনি ঠিক যে কহন একটি ত্রুটি উত্পন্ন করবে। আপনি যদি এর anyপরিবর্তে ব্যবহার করেন তবে আপনি ট্রান্সপ্লেলারটিকে মূলত বলছেন যে কিছু যায়, আপনি কী সঞ্চিত তা কোনও তথ্য সরবরাহ করছেন না a- এটি যে কোনও কিছু হতে পারে! আর তাই transpiler আপনি যাই হোক না কেন আপনি কিছু হিসাবে সংজ্ঞায়িত সঙ্গে চাও অনুমতি দেবে any।

সংক্ষেপে

  • any যে কোনও কিছু হতে পারে (সংকলনের ত্রুটি ছাড়াই আপনি এটিতে কোনও পদ্ধতি ইত্যাদি কল করতে পারেন)
  • ObjectObjectক্লাসে সংজ্ঞায়িত ফাংশন এবং বৈশিষ্ট্যগুলি প্রকাশ করে ।

283

বিট পুরানো, তবে কিছু নোট যুক্ত করতে আঘাত দেয় না।

আপনি যখন এই জাতীয় কিছু লিখবেন

let a: any;
let b: Object;
let c: {};
  • এ এর কোনও ইন্টারফেস নেই, এটি কিছু হতে পারে, সংকলক তার সদস্যদের সম্পর্কে কিছুই জানে না সুতরাং এটির এবং এর সদস্যদের উভয়কেই অ্যাক্সেস / নির্ধারণের সময় কোনও ধরণের চেকিং করা হয় না। মূলত, আপনি সংকলকটিকে " ফিরে যেতে বলছেন , আমি জানি আমি কী করছি, তাই কেবল আমার উপর বিশ্বাস করুন ";
  • b এর অবজেক্ট ইন্টারফেস রয়েছে, সুতরাং কেবলমাত্র সেই ইন্টারফেসে সংজ্ঞায়িত সদস্যরা খ এর জন্য উপলব্ধ । এটি এখনও জাভাস্ক্রিপ্ট, তাই সবকিছু অবজেক্টকে প্রসারিত করে;
  • সি টাইপস্ক্রিপ্টের মতো অন্য কোনও কিছুর মতো অবজেক্টকে প্রসারিত করে তবে কোনও সদস্য যুক্ত করে না। যেহেতু টাইপস্ক্রিপ্টে টাইপ সামঞ্জস্যতা কাঠামোগত সাব টাইপিংয়ের উপর ভিত্তি করে, নামমাত্র সাব টাইপিং নয়, সি সমান বি হিসাবে সমাপ্ত হয় কারণ তাদের একই ইন্টারফেস রয়েছে: অবজেক্ট ইন্টারফেস।

এবং এজন্যই

a.doSomething(); // Ok: the compiler trusts you on that
b.doSomething(); // Error: Object has no doSomething member
c.doSomething(); // Error: c neither has doSomething nor inherits it from Object

এবং কেন

a.toString(); // Ok: whatever, dude, have it your way
b.toString(); // Ok: toString is defined in Object
c.toString(); // Ok: c inherits toString from Object

সুতরাং Objectএবং {}টাইপস্ক্রিপ্ট সমতুল্য হয়।

আপনি যদি এই মত ফাংশন ঘোষণা

function fa(param: any): void {}
function fb(param: Object): void {}

পরমের জন্য কিছু গ্রহণ করার অভিপ্রায় সহ (সম্ভবত আপনি রান-টাইমে প্রকারগুলি পরীক্ষা করতে যাচ্ছেন এটির সিদ্ধান্ত নেওয়ার জন্য), মনে রাখবেন যে

  • এফএ এর ভিতরে , সংকলক আপনাকে পরম দিয়ে যা খুশি করতে দেবে ;
  • ভিতরে FB , কম্পাইলার শুধুমাত্র আপনি উল্লেখ দেব অবজেক্ট এর সদস্যরা।

এটা মূল্য লক্ষ যদিও, যে যদি PARAM একাধিক পরিচিত ধরনের গ্রহণ অনুমিত হয়, একটি ভাল পদ্ধতির ঘোষণা এটা ইউনিয়ন ধরনের ব্যবহার করার জন্য, হিসাবে

function fc(param: string|number): void {}

স্পষ্টতই, ও ও উত্তরাধিকারের বিধিগুলি এখনও প্রয়োগ হয়, সুতরাং আপনি যদি উত্সযুক্ত শ্রেণীর উদাহরণগুলি গ্রহণ করতে চান এবং তাদের বেস ধরণের ভিত্তিতে তাদের সাথে চিকিত্সা করতে চান

interface IPerson {
    gender: string;
}

class Person implements IPerson {
    gender: string;
}

class Teacher extends Person {}

function func(person: IPerson): void {
    console.log(person.gender);
}

func(new Person());     // Ok
func(new Teacher());    // Ok
func({gender: 'male'}); // Ok
func({name: 'male'});   // Error: no gender..

বেস টাইপ উপায় এটা করতে হবে, নয় কোনো । কিন্তু যে এর OO যেমন পণ্য, সাধ্যের বাইরে, আমি শুধু নির্মল যে চেয়েছিলেন কোনো শুধুমাত্র যখন আপনি কি আসছে জানি না ব্যবহার করা উচিত, এবং অন্য যে কোন কিছুর জন্য আপনি সঠিক টাইপ টীকা করা উচিত নয়।

হালনাগাদ:

টাইপ করা বিষয় 2.2 একটি যোগ objectধরন, যা নির্দিষ্ট করে একটি মান একটি অ আদিম হল: (অর্থাত না number, string, boolean, symbol, undefined, অথবা null)।

হিসাবে সংজ্ঞায়িত ফাংশন বিবেচনা করুন:

function b(x: Object) {}
function c(x: {}) {}
function d(x: object) {}

xএই ফাংশনগুলির মধ্যে একইরূপে উপলব্ধ বৈশিষ্ট্য থাকবে তবে dআদিমকে কল করার জন্য এটি একধরণের ত্রুটি :

b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive

2
তাদের যদি ইতিমধ্যে থাকে তবে তারা কেন যোগ করার সিদ্ধান্ত নিয়েছিল তা কি কেউ জানেন ? (বা বিপরীতে, যেটি প্রথমে এসেছিল) কিছুটা সামান্য পার্থক্য আছে, তাই না? {}Object
— CletusW

4
{}ইন্টারফেস (ইনলাইন) সংজ্ঞায়িত করার সাধারণ উপায়, কেবলমাত্র এই ক্ষেত্রে আপনি কোনও সদস্য ছাড়া ইন্টারফেসটি সংজ্ঞায়িত করছেন। সামান্য পার্থক্য প্রতিক্রিয়াতে ভালভাবে ব্যাখ্যা করা হয়েছে: " টাইপস্ক্রিপ্টের মতো অন্য কোনও কিছুর মতোই {}প্রসারিত Objectহয়"।
— ড্যানিয়েল

7
আমি আপনাকে লাইনের জন্য ভোট দিতে চাই তাই মূলত, আপনি যখন টাইপটি জানেন না, তখন যান anyএবং রান-টাইম টাইপ চেকিং করুন। ব্যবহার করবেন না any, পরিবর্তে ধরনের আপনার বিরুদ্ধে যাচাই করছি একটি ইউনিয়ন ব্যবহার করুন: TypeA|InterfaceB|string। আপনার যদি অজানা প্রকারের জন্য ডিফল্ট কেসও থাকে তবে হয় {}বা Objectইউনিয়নে যোগ করুন ।
— ILMTitan

টাইপস্ক্রিপ্ট ডকসগুলি মাঝে মধ্যে বিভ্রান্তিকর হয়, উদাহরণস্বরূপ But variables of type Object only allow you to assign any value to them - you can’t call arbitrary methods on them, even ones that actually exist:আমাকে ভাবতে বাধ্য করে যে এমনকি কল করার toStringঅনুমতি নেই, যখন আসলে আমি মনে করি তারা exist at runtimeউত্তরটি পড়ার পরে বলতে চেয়েছিল ।
— ওলগা

24

any টাইপস্ক্রিপ্টের সাথে সুনির্দিষ্ট কিছুটি অ্যালেক্সের উত্তরের মাধ্যমে বেশ ভালভাবে ব্যাখ্যা করা হয়েছে।

Objectজাভাস্ক্রিপ্ট objectটাইপ বোঝায় । সাধারণত হিসাবে {}বা কখনও কখনও ব্যবহৃত হয় new Object। জাভাস্ক্রিপ্টের বেশিরভাগ জিনিস অবজেক্ট ডেটা টাইপের সাথে সামঞ্জস্যপূর্ণ কারণ তারা এটি থেকে উত্তরাধিকার সূত্রে আসে। কিন্তু anyহয় টাইপ করা বিষয় নির্দিষ্ট এবং উভয় নির্দেশাবলী মধ্যে সবকিছু সঙ্গে সামঞ্জস্যপূর্ণ (উত্তরাধিকার ভিত্তিক নয়)। যেমন:

var foo:Object; 
var bar:any;
var num:number;

foo = num; // Not an error
num = foo; // ERROR 

// Any is compatible both ways 
bar = num;
num = bar;  

1
আপনার উত্তরটি বেশ অস্পষ্ট এবং মিশ্রিত Objectএবং objectযা টাইপস্ক্রিপ্টে বিভিন্ন ধরণের।
— m93a

@ এম93 এ: আপনি কি টিএস এর মধ্যে Objectএবং পার্থক্যটি কি তার প্রসারিত করতে পারেন object?
— আলেকজান্ডার অ্যাবাকুমভ

4
এটি সম্ভবত পার্থক্যটি জানার সেরা উত্স। মূল বক্তব্যটি হ'ল objectআদিম নয় এমন প্রতিটি কিছুর জন্য এক ধরণের, এবং Objectএমন একটি ইন্টারফেস যা এর মতো toStringএবং সাধারণ জিনিস রয়েছে । সংখ্যাটি 42একটি হবে তবে একটি হবে Objectনা object।
— m93a

20

.NET এর বিপরীতে যেখানে টাইপস্ক্রিপ্টে সমস্ত ধরণের "অবজেক্ট" থেকে আসে, সমস্ত ধরণের "যে কোনও" থেকে আসে। আমি কেবল এই তুলনাটি যুক্ত করতে চেয়েছিলাম কারণ আমি মনে করি এটি আরও সাধারণ হিসাবে তৈরি করা হবে। নেট বিকাশকারীরা টাইপস্ক্রিপ্ট একবার চেষ্টা করে।


16

অবজেক্টটি যে কোনওটির চেয়ে আরও সুনির্দিষ্ট ঘোষণা বলে মনে হচ্ছে। টাইপস্ক্রিপ্ট বিশেষ (বিভাগ 3) থেকে:

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

এছাড়াও:

যেকোন প্রকারের কোনও জাভাস্ক্রিপ্ট মান উপস্থাপন করতে ব্যবহৃত হয়। যে কোনও ধরণের একটি মান জাভাস্ক্রিপ্টের মান হিসাবে একই ক্রিয়াকলাপগুলিকে সমর্থন করে এবং যে কোনও মানগুলিতে ক্রিয়াকলাপের জন্য ন্যূনতম স্ট্যাটিক প্রকারের পরীক্ষা করা হয়। বিশেষত, যে কোনও নামের বৈশিষ্ট্যগুলি যে কোনও মানের মাধ্যমে অ্যাক্সেস করা যায় এবং যে কোনও মানকে কোনও যুক্তি তালিকার সাথে ফাংশন বা কনস্ট্রাক্টর হিসাবে ডাকা যেতে পারে।

অবজেক্টগুলি একই নমনীয়তার অনুমতি দেয় না।

উদাহরণ স্বরূপ:

var myAny : any;

myAny.Something(); // no problemo

var myObject : Object;

myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'.

0

অ্যালেক্সের উত্তরে যুক্ত করা এবং এটি সরলকরণ:

বস্তুগুলি তাদের ব্যবহারের সাথে আরও কঠোর এবং সেইজন্য প্রোগ্রামারকে আরও সংকলন সময় "মূল্যায়ন" শক্তি দেয় এবং তাই অনেক ক্ষেত্রে আরও "পরীক্ষার ক্ষমতা" সরবরাহ করে এবং কোনও ফাঁস রোধ করতে পারে, তবে যে কোনও একটি আরও জেনেরিক শব্দ এবং প্রচুর সংকলন হয় সময় চেক তাই উপেক্ষা করা হতে পারে।

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