Convertir une instance de classe de base en classe dérivée sans transtypage dans TypeScript
P粉451614834
P粉451614834 2024-02-25 19:48:09
0
2
403

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粉451614834
P粉451614834

répondre à tous(2)
P粉765570115

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 : p>

// 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;
}
P粉486138196

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 p>

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal