динамическая привязка свойства к классу на лету

#javascript #typescript #class

Вопрос:

Я хочу динамически создать класс typescript и добавить в него свойство присваивания на лету.

свойство может быть функцией, обещанием или любым другим типом и использованием this , и я хочу this , чтобы внутри него была ссылка на класс.

 let MyClass = class{
  public property: any;
  public ok = 1;
}


let property = function(){ console.log(this.ok); }

// now we want `this` to refer to MyClass instead of its function


// first trial
MyClass.prototype.property= property;

// second trial: using bind()
// we have another problem here, property not always a fnction
let propertyBind = property.bind(MyClass)


// third trial: add property while creating the class
let MyClass = class{
  public property = property ;
  public ok =1;
}
 

если property это функция, мы не можем передать this ее в качестве параметра
, потому что созданный класс будет предоставлен третьей стороне, которая применяет подпись без какого-либо параметра

 let property = (this)=>{ console.log(this.ok); }
``
 

Комментарии:

1. Где вы на самом деле создаете экземпляр класса и вызываете .property() его?

2. Не используйте динамические классы. Используйте динамические объекты.

3. позже, new myClass = MyClass()

4. Я хочу расширить базовый класс @Bergi

5. При чем здесь базовый класс? Зачем вам нужно создавать свойство «на лету» (и что это вообще значит для вас)? В чем ваша реальная проблема ?

Ответ №1:

 class BaseClass {
  public property: unknown;
  public ok = 1;
}

function addProperty<Base extends new (...args: any) => any, T>(
  baseClass: Base,
  property: T extends Function ? (this: InstanceType<Base>) => void : T
) {
  return class extends baseClass {
    public property = property;
  };
}

const MyClass1 = addProperty(BaseClass, "hello");
const myClass1 = new MyClass1();
console.log(myClass1.property); // "hello"

const MyClass2 = addProperty(BaseClass, function () {
  // here `this` has type BaseClass
  this.ok  ;
});
const myClass2 = new MyClass2();
myClass2.property();
console.log(myClass2.ok); // 2
 

Комментарии:

1. выглядит отлично, я хочу реализовать следующую подпись: function createClass(property:any){ return class extends BaseClass{ protected property = property)

2. кроме того, я хочу property быть просто функцией или любого типа, а не создаваться путем вызова внешних функций