#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
быть просто функцией или любого типа, а не создаваться путем вызова внешних функций