Index
オブジェクトAを元にオブジェクトBを作成します。
オブジェクトBの値を書き換えると、オブジェクトAの値を書き換えるようにしたいです。
以下の例のようにHumanの値を元にStudentを作成し、Studentの値を書き換えた際にHumanの値も書き変わるようにしたい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
type Human = { name: string, age: number, } type Student = { name:string, age: number, class: string } const human: Human = { name: `tanaka`, age: 20 } const student: Student = { name: human.name, age: human.age, class: `3年1組` } student.name = `yoshida`; |
ちなみに上記の例で
🔳期待値
- student.name:yoshida
- human.name:yoshida
🔳実際
- student.name:yoshida
- human.name:tanaka
となります
期待通りの動作をするコードは以下の通りです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
type Human = { name: string, age: number, } type Student = { human: Human, //Humanと同じ要素はHuman型で持つようにする class: string } const human: Human = { name: `tanaka`, age: 20 } const student: Student = { human: human,//humanを参照渡しにする class: `3年1組` } student.human.name = `yoshida`; //studentからhuman要素のアクセスする際はhuman.でアクセスする |
上記のコードのようにオブジェクトを参照渡しするようにかきかえると期待通りの動作をします。
TypeScriptには参照渡しと値渡しという考え方があります。
詳しくはサバイバルTypeScriptの記事を参照してください
基本的には下記の通りになります
- 値渡し:プリミティブ型
- 参照渡し:プリミティブ型以外
下記のコードではobjectの値を渡しているから参照渡しになるはずでは?と思うかもしれませんが、これはオブジェクトの要素のname(プリミティブ型)、age(プリミティブ型)を渡しているので値渡しになってしまいます。。
(私はここで少し躓きました、、、)
1 2 3 4 5 |
const student: Student = { name: human.name, age: human.age, class: `3年1組` } |