検索

ホームページ  >  に質問  >  本文

typescript で型キャストせずに基本クラスのインスタンスを派生クラスに変換する

基本クラスから新しいクラスを拡張し、いくつかのプロパティを追加しました。 指定された基本クラス (添付プロパティを含む) を使用して派生クラスのインスタンスを作成するにはどうすればよいですか?

このコードは機能しますが、クラス型をキャストするため、タイプ セーフではありません

型変換せずにこれを行うにはどうすればよいですか?

ああああ

P粉451614834P粉451614834270日前398

全員に返信(2)返信します

  • P粉765570115

    P粉7655701152024-02-26 14:10:39

    あなたのアプローチで型変換を完全に排除することは不可能だと思いますが、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` を作成できません");
      }
    
      結果を返します。
    }

    返事
    0
  • P粉486138196

    P粉4861381962024-02-26 11:51:43

    Object.assign () メソッド を使用して、ターゲット オブジェクトにプロパティを追加できます。このメソッドは、ターゲット オブジェクトと、入力型の 交差部分である TypeScript ライブラリ内の その呼び出しシグネチャ を返します。 これは、

    createCustomClass()

    を次のように実装できることを意味します: function createCustomClass(base: BaseClass, myValue: number): CustomClass { return Object.assign(base, { value: myValue }); }

    戻り値の型は 
    BaseClass & {value:number}

    で、その構造は CustomClass と同じであるため、関数のコンパイルでエラーは発生せず、 type アサーションが必要です

    プレイグラウンド コード リンク

    返事
    0
  • キャンセル返事