[英]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.