[解決済み] ジェネリッククラスの型パラメータから新しいオブジェクトを作成する
2022-04-20 12:19:51
質問
ジェネリッククラスでパラメータ型の新しいオブジェクトを作成しようとしています。
私のクラスでは
View
には、型パラメータとして渡されたジェネリック型のオブジェクトのリストが2つあります。
new TGridView()
と、TypeScriptは言っています。
シンボル 'TGridView' が見つかりませんでした。
これがそのコードです。
module AppFW {
// Represents a view
export class View<TFormView extends FormView, TGridView extends GridView> {
// The list of forms
public Forms: { [idForm: string]: TFormView; } = {};
// The list of grids
public Grids: { [idForm: string]: TGridView; } = {};
public AddForm(formElement: HTMLFormElement, dataModel: any, submitFunction?: (e: SubmitFormViewEvent) => boolean): FormView {
var newForm: TFormView = new TFormView(formElement, dataModel, submitFunction);
this.Forms[formElement.id] = newForm;
return newForm;
}
public AddGrid(element: HTMLDivElement, gridOptions: any): GridView {
var newGrid: TGridView = new TGridView(element, gridOptions);
this.Grids[element.id] = newGrid;
return newGrid;
}
}
}
汎用型からオブジェクトを作成することはできますか?
どのように解決するのですか?
コンパイルされたJavaScriptは型情報がすべて消去されているので
T
を使用してオブジェクトを新規作成します。
コンストラクタに型を渡すことで、汎用的でない方法でこれを行うことができます。
class TestOne {
hi() {
alert('Hi');
}
}
class TestTwo {
constructor(private testType) {
}
getNew() {
return new this.testType();
}
}
var test = new TestTwo(TestOne);
var example = test.getNew();
example.hi();
この例をジェネリックスを使って拡張し、型を強化することができます。
class TestBase {
hi() {
alert('Hi from base');
}
}
class TestSub extends TestBase {
hi() {
alert('Hi from sub');
}
}
class TestTwo<T extends TestBase> {
constructor(private testType: new () => T) {
}
getNew() : T {
return new this.testType();
}
}
//var test = new TestTwo<TestBase>(TestBase);
var test = new TestTwo<TestSub>(TestSub);
var example = test.getNew();
example.hi();
関連
-
[解決済み] TypeScriptの非同期関数でプロミスを返す
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み] クラス定数を実装するには?
-
[解決済み] テンプレート型のC#ジェネリックnew()への引数の渡し方
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
-
[解決済み】Nullable型をジェネリックパラメータにすることは可能か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TSLintの "文字列リテラルによるオブジェクトアクセス "を回避するためのコードの書き換え方法
-
[解決済み] as "というキーワードは何を意味するのでしょうか?
-
[解決済み] TypeScriptの「as const」の意味とその使用例とは?
-
[解決済み] 'タイプ 'never'にプロパティが存在しません。
-
[解決済み] TypeScriptのInterface Function Property。何が違うの?
-
[解決済み] TypeScriptでオブジェクトを初期化する方法
-
[解決済み] TypeScriptの "*.d.ts "について
-
[解決済み] Typescript オブジェクトのインデックス付きメンバの型を強制する?
-
[解決済み] AngularでNameServiceのプロバイダがない
-
[解決済み] TypeScriptのクラス型チェック