جاوااسکریپت - چگونه یک شیء JS *شود* نمونهای از کلاس تایپاسکریپت


بگو من کلاس زیر را دارم:

export class MyClass {
    str: string = '';

    foo() {
        console.log(this.str);
    }
}

سپس، در کد دیگری:

var myObj = {
    str: 'Hello World';
}

چگونه میتوانم myObj را به یک نمونه از MyClass تبدیل کنم، به طوری که خط زیر کار کند:

myObj.foo();
// writes 'Hello World' to the console

لطفاً توجه داشته باشید که نمیتوانم ایجاد myObj را تغییر دهم، زیرا در یک کتابخانهی دیگر ایجاد شده است

***** ویرایش: *****

من هنوز در حال جستجو برای یک راه حل برای این موضوع هستم. مشکل اصلی این است که MyClass به کلاسهای دیگری ارجاع دارد، که شاید آنها نیز به MyClass ارجاع داشته باشند. این یک گراف کامل از اشیاء است که من در تلاش هستم آن را به کلاسهای TypeScript تبدیل کنم.

از هر کلاس و هر خصوصیتی نوع آن را میدانم، و این کاملاً با کلاسها و خصوصیات تعریف شده در MyClass مطابقت دارد.

پاسخ شماره ۱

شاید چیزی شبیه به این: (من MyClass را به عنوان کد JS اضافه کردهام).

function becomeMyClass(o){
  var fn1=function(){
    var thing;
    MyClass.apply(arguments);
    //note: shallow copy only
    for(thing in o){
      if(Object.prototype.hasOwnProperty
        .call(o,thing)){
          this[thing]=o[thing];
      }
    }
  };
  fn1.prototype=Object.create(MyClass.prototype);
  return new fn1([].slice.call(arguments,1));
}
function MyClass(){
  this.str = "from myclass";
}
MyClass.prototype.foo=function(){
  console.log(this.str);
};
var myObj = {
  str:"from myObj"
}

myC = becomeMyClass(myObj);
console.log(myC.foo());//from myObj
console.log(myC instanceof MyClass);//true

پاسخ شماره ۲

آیا این کتابخانه دیگر که شیء را ایجاد میکند همیشه همان شیء را از تابع برمیگرداند؟ شما میتوانید یک فایل تعاریف .d.ts ایجاد کنید که مشخص میکند تابع خاص همان MyClass را برمیگرداند.