2016-12-21 7 views
-3

私はいくつかの関数を持つ共通のtypescriptクラスを持っています。私はthis.selected = Object.assign({} as AssignedTestType, newTestType);object.assignは関数をコピーしません

選択されたインスタンスはtype AssignedTestTypeであること機能を所有していないん

object.assignで「ディープ」コピーを作成するにはどうすればよいですか?または任意の代替方法?

+1

は、あなただけの '新しいAssignedTを渡すことはできません。)要件に最初の引数として「estType'インスタンス? – Pointy

+1

Lodash 'cloneDeep'? – putvande

+0

そこにはないものはコピーできません。型アサーションは型チェックにのみ影響し、 '{}'には実際のプロパティを追加しません。 '{}}はAssignedTestType'が実行時に空のオブジェクトです。あなたは、始めたいすべての方法を実装する何かを提供しなければなりません。 – artem

答えて

4

object.assignは、関数にはコピーされません

let x = {a: y => y * 2} 
 
let z = Object.assign({}, x) 
 
console.log(z.a(5)); // 10

選択したインスタンスが所有していないが虚偽だ

そのタイプのAssignedTestTypeにある機能。

この部分は真です。 Object.assignは浅いコピーのみを行い、自分の小道具を列挙します

+1

答えは私を助けませんが、私はそれを理論的に正しい解決法としてマークします。私がここのテーブルに置くことができないちょうど私のコードは、偽の動作をする... – Pascal

4

コピーする探しているプロパティはnewTestTypeのプロトタイプである場合、それらはObject.assignのみコピーオブジェクトインスタンスの自身性質から、コピーされません。

選択肢は、あなたがnewTestTypeを作成し、this.selectedに結果のインスタンスを割り当てるか、空のオブジェクトを作成し、newTestTypeにそのプロトタイプを設定するために使用されるものは何でもコンストラクタインスタンス化するかのいずれかです。どちらの場合でも、ここではObject.assignが間違ったツールです。

+0

関数()はコピーされません! – Pascal

+0

@Pascal "関数"とプロパティの間に違いはありません。 JSの関数はファーストクラスのオブジェクトであり、メソッドを作成するオブジェクトのプロパティにそれらを代入するだけです。 –

+0

私の答えで述べたように、コピーされていないプロパティ(関数を含む)はおそらくオブジェクトのプロトタイプ上にあるので、 'Object.assign'では無視されません。 –

0

オブジェクトをクローンするためにどれくらいの労力を費やすかは、実行する操作によって異なります。

最初のコールポートは、.cloneまたは.cloneDeepである必要があります。

また、プロトタイプの関数への参照をコピーすることについて説明しているかもしれません。

class MyClass { foo() {} } 
 
class MyOtherClass extends MyClass {} 
 
console.log(new MyOtherClass().__proto__.foo); // foo from MyClass

あなたがハッククローン機能を確認したい場合は、これが(未テスト)の開始である(しかし、彼らは応じて非常に高速に複雑得ることができます。その場合、解決策は、のような単純なものかもしれません

function clone(o) { 
 
    if(!isObject(o)) { 
 
     throw 'o must be a a non-function object'; 
 
    }  
 
    return (function inner(a, b = {}) { 
 
     Object.keys(a).forEach(k => { 
 
      isObject(a[k])? b[k] = inner(a[k]) : b[k] = a[k]; 
 
     });  
 
     return b; 
 
    }(o)); 
 
} 
 

 
function isObject(o) { 
 
    return o !== null && typeof o === 'object' 
 
} 
 

 
var a = { 
 
    foo: 'foo', 
 
    bar:() => { console.log('bar'); }, 
 
    bat: { 
 
     baz:() => { console.log('baz'); } 
 
    } 
 
}; 
 

 
console.log(clone(a));

関連する問題