Pesquisa de site

typescript - Como estruturar uma classe utilitária


Eu tenho várias funções utilitárias. Qual é a melhor maneira de empacotá-las e depois importá-las?

Isto é o que estou tentando fazer:

import * as util from './util'

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

Então na aula:

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

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

A mensagem de erro que recebo do VS é:

Property doSomething does not exist on type util.

Resposta #1

Se você criar um arquivo utils.ts que contenha

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

então você pode simplificar o código do seu cliente assim:

import Utils from './utils'

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

Resposta #2

Há alguns problemas aqui:

  1. Você não está instanciando nada, e doSomething é um método de instância
  2. Quando você faz import * as util, util representa o módulo, não um objeto nele.

Se você quiser Util, você deve apenas importar isso:

import { Util } from './util'

Em seguida, você deve instanciar Util, antes de finalmente chamar o método nele:

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

Aqui está seu código corrigido:

import { Util } from './util'

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

Dito isso, parece haver algo estranho na forma como você está usando seus utils. Isto é totalmente uma opinião pessoal, mas eu não chamaria métodos que "fazem algo", ou seja, causam efeitos colaterais, em um construtor.

Além disso, os métodos em Util realmente não parecem precisar estar nessa classe, já que a classe não possui nenhum estado do qual eles dependam. Você sempre pode exportar funções normais de um módulo. Se você escrever seu módulo de utilitários assim:

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

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

você estaria exportando suas funções diretamente e evitaria o problema da instanciação, e na verdade seu código original funcionaria corretamente como está.

Resposta #3

Forma alternativa:

  1. Exporte constantes no seu arquivo utils.ts:

    export const doSomething = (val: string): any => {
      return val;
    };
    
    export const doSomethingElse = (val: string): any => {
      return val;
    };
    
  2. Importe e use esses métodos no arquivo principal *.ts:

    import { doSomething, doSomethingElse } from './util';
    ...
    let value1 = doSomething('abc');
    let value2 = doSomethingElse ('efg');
    

Artigos relacionados