typescript - Hvordan strukturere hjelpeklasse


Jeg har flere hjelpefunksjoner. Hva er den beste måten å pakke dem sammen på, og deretter importere dem?

Dette er hva jeg prøver å gjøre:

import * as util from './util'

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

Så i timen:

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

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

Feilmeldingen jeg får fra VS er:

Property doSomething does not exist on type util.

Svar #1

Hvis du oppretter en fil utils.ts som inneholder

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

da kan du forenkle klientkoden din slik:

import Utils from './utils'

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

Svar #2

Det er et par problemer her:

  1. Du oppretter ikke noe, og doSomething er en instansmetode
  2. Når du gjør import * as util, representerer util modulen, ikke et objekt i den.

Hvis du vil ha Util, bør du bare importere det:

import { Util } from './util'

Deretter bør du instantiere Util, før du til slutt kaller metoden på det:

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

Her er koden din reparert:

import { Util } from './util'

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

Alt det sagt, ser det ut til å være noe merkelig med måten du bruker verktøyene dine på. Dette er helt personlig mening, men jeg ville ikke påkalle metoder som "gjør noe", altså forårsaker bivirkninger, i en konstruktør.

Også ser ikke metodene i Util egentlig ut til å trenge å være i den klassen, siden klassen ikke har noen tilstand som de er avhengige av. Du kan alltid eksportere vanlige funksjoner fra en modul. Hvis du skrev utils-modulen din slik:

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

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

du ville eksportere funksjonene dine direkte og ville unngå problemer med instansiering, og faktisk ville den opprinnelige koden din fungere korrekt som den er.

Svar #3

Alternativ måte:

  1. Eksporter konstanter i din utils.ts-fil:

    export const doSomething = (val: string): any => {
      return val;
    };
    
    export const doSomethingElse = (val: string): any => {
      return val;
    };
    
  2. Importer og bruk disse metodene i hoved-*.ts-filen:

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

Relaterte artikler