私はいくつかの関数を持つ共通のtypescriptクラスを持っています。私はthis.selected = Object.assign({} as AssignedTestType, newTestType);
object.assignは関数をコピーしません
選択されたインスタンスはtype AssignedTestType
であること機能を所有していないん
。
object.assignで「ディープ」コピーを作成するにはどうすればよいですか?または任意の代替方法?
私はいくつかの関数を持つ共通のtypescriptクラスを持っています。私はthis.selected = Object.assign({} as AssignedTestType, newTestType);
object.assignは関数をコピーしません
選択されたインスタンスはtype AssignedTestType
であること機能を所有していないん
。
object.assignで「ディープ」コピーを作成するにはどうすればよいですか?または任意の代替方法?
object.assignは、関数にはコピーされません
let x = {a: y => y * 2} let z = Object.assign({}, x) console.log(z.a(5)); // 10
選択したインスタンスが所有していないが虚偽だ
そのタイプのAssignedTestTypeにある機能。
この部分は真です。 Object.assign
は浅いコピーのみを行い、自分の小道具を列挙します
答えは私を助けませんが、私はそれを理論的に正しい解決法としてマークします。私がここのテーブルに置くことができないちょうど私のコードは、偽の動作をする... – Pascal
コピーする探しているプロパティはnewTestType
のプロトタイプである場合、それらはObject.assign
のみコピーオブジェクトインスタンスの自身性質から、コピーされません。
選択肢は、あなたがnewTestType
を作成し、this.selected
に結果のインスタンスを割り当てるか、空のオブジェクトを作成し、newTestType
にそのプロトタイプを設定するために使用されるものは何でもコンストラクタインスタンス化するかのいずれかです。どちらの場合でも、ここではObject.assign
が間違ったツールです。
関数()はコピーされません! – Pascal
@Pascal "関数"とプロパティの間に違いはありません。 JSの関数はファーストクラスのオブジェクトであり、メソッドを作成するオブジェクトのプロパティにそれらを代入するだけです。 –
私の答えで述べたように、コピーされていないプロパティ(関数を含む)はおそらくオブジェクトのプロトタイプ上にあるので、 'Object.assign'では無視されません。 –
オブジェクトをクローンするためにどれくらいの労力を費やすかは、実行する操作によって異なります。
最初のコールポートは、.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));
は、あなただけの '新しいAssignedTを渡すことはできません。)要件に最初の引数として「estType'インスタンス? – Pointy
Lodash 'cloneDeep'? – putvande
そこにはないものはコピーできません。型アサーションは型チェックにのみ影響し、 '{}'には実際のプロパティを追加しません。 '{}}はAssignedTestType'が実行時に空のオブジェクトです。あなたは、始めたいすべての方法を実装する何かを提供しなければなりません。 – artem