recherche

Maison  >  Questions et réponses  >  le corps du texte

Convertir une instance de classe de base en classe dérivée sans transtypage dans TypeScript

J'ai étendu une nouvelle classe à partir de la classe de base et ajouté quelques propriétés. Comment créer une instance d'une classe dérivée en utilisant une classe de base donnée incluant les propriétés attachées ?

Ce code fonctionne mais convertit le type de classe et n'est pas sécurisé de type

Comment faire cela sans conversion de type ?

// Base class is imported from a package. Not editable
class BaseClass {
  public x: number;
  public power() {
    return this.x * 2;
  }
}

export interface CustomClass extends BaseClass {
  value: number;
}

function createCustomClass(base: BaseClass, myValue: number): CustomClass {

  // it's not type safe to cast this variable
  // How to do it the right way in Typescript?
  const result: CustomClass = base as CustomClass;
  result.value = myValue;
  return result;
}

P粉451614834P粉451614834312 Il y a quelques jours449

répondre à tous(2)je répondrai

  • P粉765570115

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

    Je ne pense pas qu'il soit possible d'exclure complètement le transtypage en utilisant votre approche, mais si vous utilisez type Guard 检查变量 result 是否有效 CustomClass (在我的实现中是 isCustomClass ), ce sera sûr :

    // Base class is imported from a package. Not editable
    class BaseClass {
      public x: number;
      public power() {
        return this.x * 2;
      }
    }
    
    export interface CustomClass extends BaseClass {
      value: number;
    }
    
    function isCustomClass(classToCheck: any): classToCheck is CustomClass {
      return (
        typeof classToCheck?.value === "number" && classToCheck instanceof BaseClass
      );
    }
    
    function createCustomClass(base: BaseClass, myValue: number): CustomClass {
      const result = base;
      (result as CustomClass).value = myValue;
      if (!isCustomClass(result)) {
        throw new Error("Cannot create valid `CustomClass`");
      }
    
      return result;
    }

    répondre
    0
  • P粉486138196

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

    Vous pouvez utiliser la Object.assign () méthode pour ajouter des propriétés à l'objet cible. Cette méthode renvoie l'objet cible et sa signature d'appel dans la bibliothèque TypeScript qui est l'intersection des types d'entrée.

    Cela signifie que votre createCustomClass() peut être mis en œuvre comme ceci :

    function createCustomClass(base: BaseClass, myValue: number): CustomClass {
      return Object.assign(base, { value: myValue });
    }

    Le type de retour est BaseClass & {value: number},其结构与 CustomClass le même, donc la fonction se compile sans erreurs et il n'y a pas d'assertion de type requise.

    Lien du code Playground

    répondre
    0
  • Annulerrépondre