টাইপস্ক্রিপ্ট ব্যবহার করে রানটাইমের সময় কি কোনও সামগ্রীর শ্রেণি / প্রকারের নাম পাওয়া সম্ভব?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
টাইপস্ক্রিপ্ট ব্যবহার করে রানটাইমের সময় কি কোনও সামগ্রীর শ্রেণি / প্রকারের নাম পাওয়া সম্ভব?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
উত্তর:
class MyClass {}
const instance = new MyClass();
console.log(instance.constructor.name); // MyClass
console.log(MyClass.name); // MyClass
তবে: সাবধান হন যে মিনিডযুক্ত কোড ব্যবহার করার সময় নামটি সম্ভবত আলাদা হবে।
let instance: any = this.constructor; console.log(instance.name);
anyজন্য console.log(instance.constructor['name']);
interface Function { name: string; }- এটি "নেটিভ" সংজ্ঞাটি প্রসারিত করবে।
MyClass.nameআপনি যদি আপনার কোডটি ক্ষুদ্র করে দিচ্ছেন তবে ভাল কাজ করবে না। কারণ এটি ক্লাসের নামটি ছোট করে দেবে।
আমি জানি আমি পার্টিতে দেরি করেছি, তবে আমি দেখতে পাচ্ছি যে এটি খুব কার্যকর হয়।
var constructorString: string = this.constructor.toString();
var className: string = constructorString.match(/\w+/g)[1];
বিকল্পভাবে ...
var className: string = this.constructor.toString().match(/\w+/g)[1];
উপরের কোডটি পুরো কনস্ট্রাক্টর কোডটিকে স্ট্রিং হিসাবে পেয়ে থাকে এবং সমস্ত 'শব্দ' পেতে একটি রেজেক্স প্রয়োগ করে। প্রথম শব্দটি 'ফাংশন' এবং দ্বিতীয় শব্দটি শ্রেণীর নাম হওয়া উচিত।
আশাকরি এটা সাহায্য করবে.
আমার সমাধানটি ক্লাসের নামের উপর নির্ভর করা ছিল না। অবজেক্ট কনস্ট্রাক্টর.নেম থিওরিতে কাজ করে। তবে আপনি যদি আয়নিকের মতো কিছুতে টাইপস্ক্রিপ্ট ব্যবহার করে থাকেন তবে আপনি প্রোডাকশনে যাওয়ার সাথে সাথে এটি শিখাতে উঠে যাবে কারণ আয়নিকের প্রোডাকশন মোড জাভাস্ক্রিপ্ট কোডকে ছোট করে দেয়। সুতরাং ক্লাসগুলি "এ" এবং "ই" এর মতো নামযুক্ত জিনিসগুলি পেয়ে যায়।
আমি যেটা শেষ করেছিলাম তা আমার সমস্ত অবজেক্টে টাইপনেম ক্লাস ছিল যা কনস্ট্রাক্টর ক্লাসের নাম নির্ধারণ করেছে। তাই:
export class Person {
id: number;
name: string;
typeName: string;
constructor() {
typeName = "Person";
}
হ্যাঁ আসলেই জিজ্ঞাসা করা হয়নি। তবে এমন কোনও কিছুর জন্য কনস্ট্রাক্টর.নাম ব্যবহার করা যা সম্ভবত রাস্তায় নামিয়ে দেওয়া সম্ভবত মাথা ব্যথার জন্য ভিক্ষা করছে।
এই প্রশ্নটি দেখুন ।
যেহেতু টাইপস্ক্রিপ্টটি জাভাস্ক্রিপ্টে সংকলিত হয়েছে, রানটাইম আপনি জাভাস্ক্রিপ্ট চালাচ্ছেন, তাই একই বিধি প্রযোজ্য হবে।
আপনার প্রথমে উদাহরণটি কাস্ট করা দরকার anyকারণ Functionধরণের সংজ্ঞাতে কোনও nameসম্পত্তি নেই।
class MyClass {
getName() {
return (<any>this).constructor.name;
// OR return (this as any).constructor.name;
}
}
// From outside the class:
var className = (<any>new MyClass()).constructor.name;
// OR var className = (new MyClass() as any).constructor.name;
console.log(className); // Should output "MyClass"
// From inside the class:
var instance = new MyClass();
console.log(instance.getName()); // Should output "MyClass"
টাইপস্ক্রিপ্ট ২.৪ (এবং সম্ভাব্য পূর্বে) দিয়ে কোডটি আরও পরিষ্কার হতে পারে:
class MyClass {
getName() {
return this.constructor.name;
}
}
// From outside the class:
var className = (new MyClass).constructor.name;
console.log(className); // Should output "MyClass"
// From inside the class:
var instance = new MyClass();
console.log(instance.getName()); // Should output "MyClass"
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.nameবা এর (this as object).constructor.nameচেয়ে ভাল anyকারণ আপনি আসলে স্বতঃপূরণ পাবেন :-)
Angular2 এ এটি উপাদানগুলির নাম পেতে সহায়তা করতে পারে:
getName() {
let comp:any = this.constructor;
return comp.name;
}
কমপ: যে কোনও প্রয়োজন কারণ টাইপস্ক্রিপ্ট সংকলন ত্রুটি জারি করবে কারণ প্রাথমিকভাবে ফাংশনটির সম্পত্তির নাম নেই।
element.nativeElementপেতে আপনি @Optional() element: ElementRef<HTMLElement>if (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
সম্পূর্ণ টাইপস্ক্রিপ্ট কোড
public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
এই সমাধানটি মিনিফিকেশন উগ্লিফিকেশনের পরে কাজ করে তবে মেটাডেটা সহ ক্লাসগুলি সাজানোর প্রয়োজন requires
আমরা মেটাডেটা সহ আমাদের সত্তা ক্লাসগুলি সাজানোর জন্য কোড জেনারেশনটি ব্যবহার করি:
@name('Customer')
export class Customer {
public custId: string;
public name: string;
}
তারপরে নিম্নলিখিত সহায়িকার সাথে গ্রাস করুন:
export const nameKey = Symbol('name');
/**
* To perserve class name though mangling.
* @example
* @name('Customer')
* class Customer {}
* @param className
*/
export function name(className: string): ClassDecorator {
return (Reflect as any).metadata(nameKey, className);
}
/**
* @example
* const type = Customer;
* getName(type); // 'Customer'
* @param type
*/
export function getName(type: Function): string {
return (Reflect as any).getMetadata(nameKey, type);
}
/**
* @example
* const instance = new Customer();
* getInstanceName(instance); // 'Customer'
* @param instance
*/
export function getInstanceName(instance: Object): string {
return (Reflect as any).getMetadata(nameKey, instance.constructor);
}
আপনি কী ধরনের প্রত্যাশা করবেন তা যদি আপনি ইতিমধ্যে জানেন (উদাহরণস্বরূপ, যখন কোনও পদ্ধতিটি ইউনিয়নের ধরণটি দেয় ) তবে আপনি প্রকার রক্ষক ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, আদিম ধরণের জন্য আপনি টাইপফ গার্ড ব্যবহার করতে পারেন :
if (typeof thing === "number") {
// Do stuff
}
জটিল ধরণের জন্য আপনি একটি উদাহরণ গার্ড ব্যবহার করতে পারেন :
if (thing instanceof Array) {
// Do stuff
}