पैरामीटर कारणों के रूप में पासिंग वर्ग त्रुटि "newable नहीं है"

वोट
35

मैं कुछ कार्य करने के लिए एक पैरामीटर, कि इस वर्ग का दृष्टांत और यह वापस आ जाएगी के रूप में एक वर्ग के पारित करने के लिए कोशिश कर रहा हूँ। यहाँ मेरी कोड है:

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

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

जब मैं इस संकलन करने की कोशिश कर रहा हूँ, मैं हो रही है:

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

मैं क्या गलत कर रहा हूं?

यदि एक newable प्रकार मान एक वस्तु निर्माता मैं कैसे रनटाइम पर निर्माता समारोह पारित करते है?

09/10/2012 को 15:30
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
48

हम typeof (MyClass) समारोह हस्ताक्षर में कक्षाओं से वस्तुओं को अलग करने के कहने के लिए कुछ की जरूरत है।

वैसे भी, आप वास्तव में आप समस्या निर्माता प्रकार हस्ताक्षर का उपयोग करके हल कर सकते हैं। इस वर्ग को ध्यान में रखते:

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

एक प्रकार है कि आप तो एक समारोह में दृष्टांत के रूप में कर सकते हैं कि कक्षा पास करने के लिए, आप वास्तव में इस तरह वर्ग निर्माता हस्ताक्षर नकल करने के लिए है:

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

संपादित करें: वहाँ एक सरल उपाय codeplex पर पाया है:

आप इस तरह अपने वर्ग के लिए एक इंटरफेस बनाने के लिए:

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

फिर, अपने समारोह हस्ताक्षर में इसका इस्तेमाल करते हैं:

function sample(MyClass: IMyClass) {
    var obj = new MyClass("hello");
}
13/10/2012 को 09:45
का स्रोत उपयोगकर्ता

वोट
14

इसे इस्तेमाल करे:

export class MyApp {
    registerView(viewKlass: typeof A.Views.View): void {
        var test = new viewKlass();
    } 
}
28/06/2016 को 16:18
का स्रोत उपयोगकर्ता

वोट
6

2 तरीके टाइपप्रति में कक्षाएं पास करने के लिए कर रहे हैं। अगर तुम:

  • वर्ग आप के माध्यम से गुजर रहे हैं की सुपर क्लास पता (पहले से ही कोरी एलिक्स द्वारा अनुशंसित):

    class MyClass extends MySuperClass{ }
    
    makeMyClass(classRef: typeof MySuperclass) {
        return new classRef();
    }
    
    makeMyClass(MyClass);
    
  • कक्षाएं निर्माता समारोह के हस्ताक्षर पता :

    class MyClass {
        constructor(arg: string) {}
    }
    
    makeMyClass(classRef: { new(arg: string) }) {
        return new classRef('hello');
    }
    
    makeMyClass(MyClass);
    
25/04/2017 को 14:24
का स्रोत उपयोगकर्ता

वोट
2

अन्य उत्तर के पूरक करने के लिए; मैं एक उपयोगिता प्रकार मैं एक सामान्य पैरामीटर सुनिश्चित करने के लिए चारों ओर रखना है / क्षेत्र एक वर्ग / newable है:

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

आप तो आप एक वर्ग निर्माता सुनिश्चित कर सकते हैं:

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

Newable<T>दृष्टिकोण से काम करता है जहां typeof T--where Tएक सामान्य type-- करता है नहीं।

उदाहरण के लिए: register<T extends TViewBase>(view: typeof T)निम्न त्रुटि में परिणाम:

[Ts] 'टी' केवल एक प्रकार को संदर्भित करता है, लेकिन यहाँ एक मूल्य के रूप में इस्तेमाल किया जा रहा है।

31/08/2017 को 14:06
का स्रोत उपयोगकर्ता

वोट
2

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन यहाँ जाता है:

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

उत्तर मिला था यहां

02/07/2017 को 18:06
का स्रोत उपयोगकर्ता

वोट
0

अपनी स्थिति के आधार पर, तीन समाधान bellow के लिए पर्याप्त नहीं हो सकता है:

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

ऐसे मामलों जहाँ आप कुछ कॉल करना चाहते हैं कर रहे हैं स्थिर तरह के तरीकों myClass.someMethod()1और 2आपको लगता है कि ऐसा करने के लिए अनुमति नहीं दी जाएगी (और कृपया अपने अनुप्रयोग में किसी भी उपयोग कभी नहीं), क्योंकि वे उस विधि के बारे में पता नहीं है।

या फिर ऐसे मामले हैं जब आप करना चाहते हैं MyClassएक के रूप में सार वर्ग और साथ myClass का एक उदाहरण बनाने के let instance = new myClass। उस मामले में, 3असफल हो जायेगी।

क्या मैं इन मामलों में क्या के लिए एक विशेष प्रकार का बनाने के लिए है MyClassकि मुद्दों मैं ऊपर प्रकाश डाला है, जो कुछ इस तरह दिखता का समाधान होगा:

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

Btw। अपने तरीकों में लौटने प्रकार जोड़ने के लिए ताकि आप उचित IntelliSense मिल मत भूलना।

04/10/2019 को 18:36
का स्रोत उपयोगकर्ता

वोट
-1

सार के लिए धन्यवाद - एक मामूली बदलाव यह सब काम ठीक कर देता है। नीचे दिए गए उदाहरण में, हम "नए अप" TestViewठोस परीक्षण ध्यान में रखते हुए नहीं बल्कि विधि के भीतर यह नया करने के लिए कोशिश कर रहा से पारित करने के लिए,।

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())
09/10/2012 को 16:09
का स्रोत उपयोगकर्ता

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