私が到達した方法よりも良い方法を探しているときに、私はこれにつまずきました。回答を読んで試してみると、他の回答は私には簡潔に感じられなかったので、私がしていることを投稿する価値があると思いました。新しいインターフェイスをセットアップするたびに、短いコードを書くだけでよいことが重要でした。私は解決しました...
カスタムの一般的なdeepCopy関数の使用:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
インターフェースを定義する
interface IX {
a: string;
b: any;
c: AnotherType;
}
...そして、別のconstでデフォルトを定義します。
const XDef : IX = {
a: '',
b: null,
c: null,
};
次に、このように初期化します:
let x : IX = deepCopy(XDef);
それだけで十分です。
.. しかしながら ..
ルート要素をカスタムで初期化する場合は、カスタムのデフォルト値を受け入れるように、deepCopy関数を変更できます。関数は次のようになります。
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
代わりに、次のように呼び出すことができます。
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
ディープコピーのその他の推奨される方法はすべて機能します。浅いコピーのみが必要な場合は、Object.assignで十分であり、ユーティリティdeepCopyまたはdeepCopyAssign関数の必要性はありません。
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
既知の問題点
- この見た目では深く割り当てられませんが、
deepCopyAssign割り当ての前にタイプを反復およびチェックするように変更することはそれほど難しくありません。
- 関数と参照は、解析/文字列化プロセスによって失われます。私は自分の仕事にそれらを必要としませんし、OPも必要としませんでした。
- カスタム初期値は、実行時にIDEまたは型チェックによって示唆されません。