web-dev-qa-db-fra.com

Comment structurer la classe d'utilité

J'ai plusieurs fonctions utilitaires. Quel est le meilleur moyen de les emballer, puis de les importer?

C'est ce que j'essaie de faire:

import * as util from './util'

export class myClass{
     constructor()
     {
           util.doSomething("test");
     }
}

Puis en classe:

export class Util{
    doSomething(val: string){ return val;}

    doSomethingElse(val: string{ return val;}
}

Le message d'erreur que je reçois de VS est "La propriété ne fait pas quelque chose sur le type util."

38
Greg Gum

Si vous créez un fichier utils.ts qui contient

export default class Utils {
    static doSomething(val: string) { return val; }
    static doSomethingElse(val: string) { return val; }
}

alors vous pouvez simplifier votre code client comme ceci:

import Utils from './utils'

export class MyClass {
     constructor()
     {
         Utils.doSomething("test");
     }
}
68
k7sleeper

Il y a quelques problèmes ici:

  1. Vous n'instanciez rien et doSomething est une méthode d'instance.
  2. Lorsque vous faites import * as util, util représente le module et non un objet. 

Si vous voulez Util, vous devriez simplement importer cela:

import { Util } from './util'

Ensuite, vous devriez instancier Util, avant d’appeler enfin la méthode:

var u = new Util();
u.doSomething("test");

Voici votre code corrigé:

import { Util } from './util'

export class MyClass{
     constructor()
     {
         var u = new Util();
         u.doSomething("test");
     }
}

Cela dit, il semble y avoir quelque chose de bizarre dans la façon dont vous utilisez vos utils. C’est une opinion totalement personnelle, mais je n’invoquerais pas de méthode qui "fait quelque chose", c’est-à-dire qui provoque des effets secondaires, dans un constructeur. 

De plus, les méthodes dans Util ne semblent pas vraiment devoir être dans cette classe, car la classe ne contient aucun état sur lequel elles dépendent. Vous pouvez toujours exporter des fonctions régulières à partir d'un module. Si vous avez écrit votre module utils comme ceci:

export function doSomething(val: string) { return val; }

export function doSomethingElse(val: string) { return val; }

vous exporteriez vos fonctions directement et évitiez les problèmes d'instanciation, et votre code d'origine fonctionnerait correctement tel quel.

29
Asad Saeeduddin

Ou vous pouvez exporter est comme un objet littéral:

export const Util = {
    doSomething(val: string){ return val;},
    doSomethingElse(val: string{ return val;}
}
0
Max Rahder