Maison > Questions et réponses > le corps du texte
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
// 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粉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 : 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粉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.