বেশিরভাগ সঠিক, তবে খুব দক্ষ উত্তর নয় এমন একটি পুরানো প্রশ্ন। এটি আমার প্রস্তাব:
একটি বেস ক্লাস তৈরি করুন যার মধ্যে init () পদ্ধতি এবং স্ট্যাটিক কাস্ট পদ্ধতি রয়েছে (একটি একক বস্তু এবং অ্যারের জন্য)। স্থির পদ্ধতিগুলি যে কোনও জায়গায় হতে পারে; বেস ক্লাস এবং init () সহ সংস্করণ পরে সহজ এক্সটেনশানগুলির অনুমতি দেয়।
export class ContentItem {
// parameters: doc - plain JS object, proto - class we want to cast to (subclass of ContentItem)
static castAs<T extends ContentItem>(doc: T, proto: typeof ContentItem): T {
// if we already have the correct class skip the cast
if (doc instanceof proto) { return doc; }
// create a new object (create), and copy over all properties (assign)
const d: T = Object.create(proto.prototype);
Object.assign(d, doc);
// reason to extend the base class - we want to be able to call init() after cast
d.init();
return d;
}
// another method casts an array
static castAllAs<T extends ContentItem>(docs: T[], proto: typeof ContentItem): T[] {
return docs.map(d => ContentItem.castAs(d, proto));
}
init() { }
}
অনুরূপ মেকানিক ( অ্যাসাইন () সহ ) @ অ্যাডাম 111 পি পোস্টে উল্লেখ করা হয়েছে। এটি করার জন্য অন্য একটি (আরও সম্পূর্ণ) উপায়। @ টিমোথি পেরেজ নির্ধারিত সমালোচনা () করলেও, তবে এটি এখানে পুরোপুরি উপযুক্ত।
উদ্ভূত (বাস্তব) শ্রেণি প্রয়োগ করুন:
import { ContentItem } from './content-item';
export class SubjectArea extends ContentItem {
id: number;
title: string;
areas: SubjectArea[]; // contains embedded objects
depth: number;
// method will be unavailable unless we use cast
lead(): string {
return '. '.repeat(this.depth);
}
// in case we have embedded objects, call cast on them here
init() {
if (this.areas) {
this.areas = ContentItem.castAllAs(this.areas, SubjectArea);
}
}
}
এখন আমরা পরিষেবা থেকে পুনরুদ্ধার করা কোনও বস্তু নিক্ষেপ করতে পারি:
const area = ContentItem.castAs<SubjectArea>(docFromREST, SubjectArea);
সাবজেক্টআরিয়া সামগ্রীর সমস্ত শ্রেণিবিন্যাসের সঠিক শ্রেণি থাকবে।
একটি ব্যবহারের কেস / উদাহরণ; একটি কৌণিক পরিষেবা তৈরি করুন (আবার বিমূর্ত বেস শ্রেণি):
export abstract class BaseService<T extends ContentItem> {
BASE_URL = 'http://host:port/';
protected abstract http: Http;
abstract path: string;
abstract subClass: typeof ContentItem;
cast(source: T): T {
return ContentItem.castAs(source, this.subClass);
}
castAll(source: T[]): T[] {
return ContentItem.castAllAs(source, this.subClass);
}
constructor() { }
get(): Promise<T[]> {
const value = this.http.get(`${this.BASE_URL}${this.path}`)
.toPromise()
.then(response => {
const items: T[] = this.castAll(response.json());
return items;
});
return value;
}
}
ব্যবহার খুব সহজ হয়ে যায়; একটি অঞ্চল পরিষেবা তৈরি করুন:
@Injectable()
export class SubjectAreaService extends BaseService<SubjectArea> {
path = 'area';
subClass = SubjectArea;
constructor(protected http: Http) { super(); }
}
( h ) পরিষেবাটি প্রাপ্ত পদ্ধতি সাবজেক্টআরিয়া অবজেক্টস হিসাবে সম্পূর্ণ কাস্ট করা একটি অ্যারের প্রতিশ্রুতি ফিরিয়ে দেবে (পুরো শ্রেণিবিন্যাস)
এখন বলুন, আমাদের আরও একটি ক্লাস রয়েছে:
export class OtherItem extends ContentItem {...}
সঠিক শ্রেণিতে ডেটা এবং ক্যাসেট পুনরুদ্ধার করে এমন একটি পরিষেবা তৈরি করা যেমন সহজ:
@Injectable()
export class OtherItemService extends BaseService<OtherItem> {
path = 'other';
subClass = OtherItem;
constructor(protected http: Http) { super(); }
}