[英]TypeScript dynamic class - combine/remove
我正在尝试创建一个动态类,该动态类使用许多其他可能的类的组件构建。
我正在尝试使用ES6 Object.assign()添加和删除它们,并且可以获取要复制的变量,但似乎无法获取要复制的方法。
这是我要执行的操作的一个示例:
class foo {
salad: string = 'salad';
chop(){
console.log('Chop');
}
}
class man {
nuts: string = 'nuts';
kick(){
console.log('Kick')
}
}
class choo {
add(){
var f: foo = new foo();
var m: man = new man();
//Copy variables
Object.assign(this, f, m);
//Copy methods
//Object.assign(this.prototype, f, m);
}
remove(){
d = Object.getPrototypeOf(foo);
for (key in d){
delete this[key]
}
}
}
var karate = new choo();
karate.add();
//karate.chop();
console.log(karate.salad);
//karate.kick();
console.log(karate.nuts);
我试图在http://fiddlesalad.com/typescript/上分享一个示例,但是这样无法保存。 不起作用的代码被注释掉。
ES6建议使用Object.assign(this.prototype,obj1)将原型函数从一个类复制到另一个类,但TypeScript似乎不喜欢它。
有任何想法吗?
这是一个完全hack,但它似乎可以满足您的需求:
function extend < A, B > (d: A,
b: B) {
for (var x in b) d[x] = b[x];
return <A & B > d;
}
interface Object {
assign < P, Q > (a: P,
...b: Q[]): P & Q;
}
interface ifoo {
salad: string;
chop();
}
interface iman {
nuts: string;
kick();
}
class foo implements ifoo {
salad: string = 'salad';
chop() {
console.log('Chop');
}
}
class man implements iman {
nuts: string = 'nuts';
kick() {
console.log('Kick')
}
}
class choo {
foo: foo;
man: man;
add() {
return extend(this, extend(this.foo = new foo(), this.man = new man()));
}
remove() {
Object.keys(this.man).forEach(k => delete this[k]);
return <ifoo><any>this;
}
}
let both = new choo();
var karate = both.add();
console.log("karate", karate);
karate.chop();
console.log(karate.salad);
karate.kick();
console.log(karate.nuts);
let chooman = both.remove();
console.log("karate", karate);
chooman.chop();
首先,我要指出,mixin可能是我正在寻找的正确答案。
这是一篇关于mixin的好文章:
https://www.stevefenton.co.uk/2014/02/TypeScript-Mixins-Part-One/
话虽如此,我确实找到了一个使用Object.assign()
的解决方案,尽管由于直接更改__proto__
可能使它有些皱眉。
Choo现在将如下所示:
class choo {
add(){
var f: foo = new foo();
var m: man = new man();
//Copy variables
Object.assign(this, f, m);
//Copy methods
Object.assign(this.__proto__, foo.prototype, man.prototype);
}
}
remove()
方法已删除,因为如果Object.assign()
共享相同的名称,它们将覆盖类方法。 在测试之前,我不确定是否会有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.