clasa care trece drept cauze parametru „nu este reinnoita“ eroare

voturi
35

Am încercat să treacă o clasă ca parametru într-o anumită funcție, care va instantia această clasă și returnați-l. Aici este codul meu:

module A.Views {
  export class View { ... }
}

module A.App {
  export class MyApp {
    ...
    registerView(viewKlass:A.Views.View):void
    {
        var test = new viewKlass;
    } 
  }
}

Când am încercat să compileze acest lucru, eu sunt obtinerea:

(...): Value of type 'Views.View' is not newable.

ce fac greșit?

Dacă o valoare de tip reinnoita este un constructor obiect cum pot trece funcția de constructor în timpul rulării?

Întrebat 09/10/2012 la 15:30
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
48

Avem nevoie de ceva de spus typeof (Clasa_Mea) pentru a distinge obiecte din clase în semnături funcționale.

Oricum, vă puteți rezolva de fapt problema prin utilizarea de tip constructor semnătură. Având în vedere această clasă:

class MyClass {
    constructor (private name: string) {
    }
}

Pentru a trece această clasă ca un tip pe care o puteți instantia apoi într-o funcție, trebuie de fapt să duplica semnătura constructorului clasei ca aceasta:

function sample(MyClass: new (name: string) => MyClass) {
    var obj = new MyClass("hello");
}

EDIT: Există o soluție simplă găsit pe CodePlex:

Trebuie să creați o interfață pentru clasa ta ca aceasta:

interface IMyClass {
    new (name: string): MyClass;
}

Apoi, l utilizați în semnătură funcția:

function sample(MyClass: IMyClass) {
    var obj = new MyClass("hello");
}
Publicat 13/10/2012 la 09:45
sursa de către utilizator

voturi
14

Incearca asta:

export class MyApp {
    registerView(viewKlass: typeof A.Views.View): void {
        var test = new viewKlass();
    } 
}
Publicat 28/06/2016 la 16:18
sursa de către utilizator

voturi
6

Există 2 moduri de a trece clase de dactilografiat. Daca tu:

  • știu superclasa clasei ce trece prin (deja recomandat de Corey Alix):

    class MyClass extends MySuperClass{ }
    
    makeMyClass(classRef: typeof MySuperclass) {
        return new classRef();
    }
    
    makeMyClass(MyClass);
    
  • cunosc semnătura funcției clase constructor :

    class MyClass {
        constructor(arg: string) {}
    }
    
    makeMyClass(classRef: { new(arg: string) }) {
        return new classRef('hello');
    }
    
    makeMyClass(MyClass);
    
Publicat 25/04/2017 la 14:24
sursa de către utilizator

voturi
2

Pentru a completa celelalte răspunsuri; Am un tip de utilitate am păstra în jurul valorii de a asigura un parametru generic / câmp este o clasă / reinnoita:

/* new T() */
export type Newable<T> = { new (...args: any[]): T; };

Puteți asigura, atunci veți primi un constructor de clasă:

class MyApp<TViewBase>
{
  register<TView extends TViewBase>(view: Newable<TView>) { 
  }
}

Newable<T>abordare funcționează în cazul în care typeof T--where Teste un type-- generic nu.

De exemplu: register<T extends TViewBase>(view: typeof T)rezultate în următoarea eroare:

[Ts] „T“ se referă numai la un tip, dar este folosit ca valoare aici.

Publicat 31/08/2017 la 14:06
sursa de către utilizator

voturi
2

Știu că aceasta este o întrebare veche, dar aici merge:

...
registerView(viewKlass: { new(): A.Views.View }):void
{
    var test = new viewKlass();
} 

Raspuns a fost găsit aici .

Publicat 02/07/2017 la 18:06
sursa de către utilizator

voturi
0

În funcție de situația dumneavoastră, burduful trei soluție nu ar putea fi suficient:

  1. myClass: new (name: string) => MyClass
  2. interface IMyClass { new (name: string): MyClass; }; myClass: IMyClass
  3. myClass: typeof MyClass

Există cazuri în care s- ar dori pentru a apela unele statice metode , cum ar fi myClass.someMethod(). 1și 2nu vă va permite să facă acest lucru (și pls nu utilizați în aplicația dvs.) , deoarece ei nu știu despre această metodă.

Sau există cazuri când doriți să aveți MyClassca o abstractă clasă și de a crea o instanță de Clasa_Mea cu let instance = new myClass. În acest caz, 3va eșua.

Ceea ce fac în aceste cazuri , este de a crea un tip special pentru MyClasscă va rezolva problemele evidențiate mai sus am, care arata ceva de genul:

type MyClassContructor<T extends MyClass> = typeof MyClass & Constructor<T>;

BTW. Nu uitați să adăugați tipuri de returnare la metodele tale astfel încât să obțineți Intellisense corespunzătoare.

Publicat 04/10/2019 la 18:36
sursa de către utilizator

voturi
-1

Vă mulțumim pentru GIST - o ușoară schimbare totul de lucru bine face. În exemplul de mai jos, „noi up“ TestViewpentru a trece în ecranul de testare de beton, mai degrabă decât a încerca să - l noi în cadrul metodei.

module V.Views {
   export class View {
      public someVar: any;
      // the presence of constructor doesn't affect the error triggering
   }
}

module V.App {
    export class Application {
        public registerView(url: string, viewKlass: V.Views.View): void
        {
            var test = viewKlass;
        }
    }
}

var app = new V.App.Application;

class TestView extends V.Views.View {
}

class TestView2 extends V.Views.View {
}

app.registerView('', new TestView())
app.registerView('content/view/:slug/', new TestView2())
Publicat 09/10/2012 la 16:09
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more