基本クラスから新しいクラスを拡張し、いくつかのプロパティを追加しました。 指定された基本クラス (添付プロパティを含む) を使用して派生クラスのインスタンスを作成するにはどうすればよいですか?
このコードは機能しますが、クラス型をキャストするため、タイプ セーフではありません
あなたのアプローチで型変換を完全に排除することは不可能だと思いますが、type Guard を使用して変数 result が有効かどうかを確認する場合は、CustomClass (私の場合、実装は isCustomClass です)、これは安全です: p>
type Guard
result
CustomClass
isCustomClass
// 基本クラスはパッケージからインポートされます。編集できません クラスBaseClass { パブリック x: 数値; 公共権力() { this.x * 2 を返します。 } } エクスポート インターフェイス CustomClass は BaseClass を拡張します { 値: 数値; } 関数 isCustomClass(classToCheck: any): classToCheck は CustomClass { 戻る ( typeof classToCheck?.value === "number" && classToCheck インスタンスの BaseClass ); } function createCustomClass(base: BaseClass, myValue:number): CustomClass { const 結果 = ベース; (結果は CustomClass になります).value = myValue; if (!isCustomClass(result)) { throw new Error("有効な `CustomClass` を作成できません"); } 結果を返します。 }
Object.assign () メソッド を使用して、ターゲット オブジェクトにプロパティを追加できます。このメソッドは、ターゲット オブジェクトと、入力型の 交差部分である TypeScript ライブラリ内の その呼び出しシグネチャ を返します。 これは、
メソッド
を次のように実装できることを意味します: function createCustomClass(base: BaseClass, myValue: number): CustomClass { return Object.assign(base, { value: myValue }); }
戻り値の型は
で、その構造は CustomClass と同じであるため、関数のコンパイルでエラーは発生せず、 type アサーションが必要です。
type アサーションが必要です
あなたのアプローチで型変換を完全に排除することは不可能だと思いますが、
type Guard
を使用して変数result
が有効かどうかを確認する場合は、CustomClass
(私の場合、実装はisCustomClass
です)、これは安全です: p>Object.assign ()
createCustomClass()メソッド
を使用して、ターゲット オブジェクトにプロパティを追加できます。このメソッドは、ターゲット オブジェクトと、入力型の 交差部分である TypeScript ライブラリ内の その呼び出しシグネチャ を返します。 これは、を次のように実装できることを意味します:
function createCustomClass(base: BaseClass, myValue: number): CustomClass { return Object.assign(base, { value: myValue }); }
BaseClass & {value:number}で、その構造は
プレイグラウンド コード リンクCustomClass
と同じであるため、関数のコンパイルでエラーは発生せず、type アサーションが必要です
。