実現したいこと
Aクラスを継承するBクラスがあり、protected _params という同じ名前の内容の違うオブジェクトを持っています。Bでそのオブジェクトをオーバーライドし、型アサーションをしたのですが、Bの _paramsの型がAParamsから変更できません。
該当のソースコード
typescript
1type AParams = { 2 name: string, 3 age: number, 4 fuga: string; 5}; 6 7class A { 8 protected _params: AParams = { 9 name: "A", 10 age: 12, 11 fuga: 'AA' 12 }; 13} 14 15type BParams = AParams & { 16 name: string, 17 age: number, 18 hoge: number; 19}; 20 21class B extends A { 22 constructor() { 23 super(); 24 25 this._params = { 26 ...this._params, 27 name: "B", 28 age: 12, 29 hoge: 1 30 } as BParams; 31 } 32}
エラーメッセージ
クラスBの this._params は、AParams のままです。(vscode, typescript 5.2.2)
試したこと
PT3.5の提案も以下のものを試しましたがだめでした。
typescript
1//1. 2(this._params as BParams) = { 3...this._params, 4name: "B", 5age: 12, 6hoge: 1 7} 8 9//2. 10this._params = { 11...this._params, 12name: "B", 13age: 12, 14hoge: 1 15} as Bparams 16 17//3. 18this._params = { 19super["_params"], 20name: "B", 21age: 12, 22hoge: 1 23}
よろしくお願いします。
コードが見辛くなってしまい、申し訳ございません。
失礼します。 そもそも「protected _params プロパティを持つ A と、それを継承した A を作る」こと自体がチグハグな印象を受けます。
差し支えなければ、どのようなメソッド・関数を実装するためにこのようなクラスを作ろうとされているのかも共有していただけると考える材料になるかもしれません。
質問ありがとうございます。
未熟なもので、おかしなことを書いているかもしれませんが、申し訳ありません。
class Aがまずあり、それを class Bが継承します。
class Bは A とほぼ同じ機能を持っていますが、少しだけ高機能で、パラメータの種類が増えます。
ここで、Aのもつ _params を引き継ぐ語ちでBでオーバーライドして使いたいです。
しかしオーバーライドしても型を変更できませんので質問いたしました。
class Aのパラメータは、this._paramsA 、 class B のパラーメータは this._paramsB と、名前を別にして、class Bでは
this._paramsB = {
...this._paramsA,
 newPropA: 1,
 newPropB: 2,
}
とすれば、期待通りなのですが、これだと、class Bは2つパラメータの(_paramsAと_paramsB)を持つことになってしまいます。できれば同じ名前の _params で、継承する側が親の同名のプロパティを上書きする形にしたいと考えています。 上書き自体はできるのですが、なぜか型が替えられません(Aの_paramsのままになる)
その「パラメータ」と呼ばれているものについて、それはどこで読み書きされることを目的とされていますか?
外部から読み書きしたいだけなら
```typescript 
interface WithParams<P> {
  params: P
}
```
のようなインターフェスを A, B それぞれが実装するだけで住むと思いますが、protected ということは、クラス内で使用されるということですよね?
親クラスAの_params: APrams プロパティに、継承するBクラスが、新しいkeyを追加してそれをBparamsとしたいのですが、それがどうやってやるのかわからないという質問です。

回答1件
あなたの回答
tips
プレビュー