angularjs - टाइपस्क्रिप्ट को अपग्रेड करने के बाद, कोणीय नियंत्रक पंजीकरण अब संकलित करने में विफल रहता है




typescript typescript2.0 (3)

चूंकि IController सभी गुण वैकल्पिक हैं, मेरा मानना ​​है कि आप जो त्रुटियां देख रहे हैं वे टाइपस्क्रिप्ट 2.4 में "कमजोर प्रकार" की नई जांच का परिणाम हैं। विवरण के लिए माइक्रोसॉफ्ट से इस लिंक को देखें। इस संबंधित गिथब मुद्दे को भी देखें

माइक्रोसॉफ्ट से कुछ प्रासंगिक उद्धरण:

टाइपस्क्रिप्ट 2.4 में, हम कमजोर प्रकारों को कॉल करने के लिए एक समान जांच जोड़ रहे हैं। किसी भी प्रकार जिसमें केवल वैकल्पिक गुण होते हैं, को कमजोर प्रकार माना जाता है क्योंकि इससे कुछ प्रतिबंध दिए जाते हैं जो इसे सौंपा जा सकता है।

...

टाइपस्क्रिप्ट 2.4 में, अब गुणों में ओवरलैप होने पर कमजोर प्रकार को कुछ भी असाइन करने में त्रुटि होती है।

...

आप इसे टाइपस्क्रिप्ट के रूप में सोच सकते हैं "इन्हें कमजोर गारंटी" इन प्रकारों की कमजोर गारंटी को पकड़ने के लिए जो अन्यथा चुप कीड़े होंगी।

चूंकि यह एक तोड़ने वाला परिवर्तन है, इसलिए आपको उन कामकाजों के बारे में जानने की आवश्यकता हो सकती है जो सख्त वस्तु शाब्दिक जांच के लिए समान हैं:

  1. गुणों की घोषणा करें यदि वे वास्तव में मौजूद हैं।
  2. कमजोर प्रकार (यानी [propName: string]: {}) में एक सूचकांक हस्ताक्षर जोड़ें।
  3. एक प्रकार का दावा करें (यानी विकल्प के रूप में विकल्प)।

संपादित करें: इस जानकारी के आधार पर, IController में परिभाषित तरीकों में से एक को लागू करने के लिए एक सरल समाधान होगा। उदाहरण के लिए, जैसा टिप्पणियों में @ एमी द्वारा उल्लिखित है, आप बस अपने नियंत्रक में एक खाली $onInit विधि को परिभाषित कर सकते हैं।

संपादित करें: पूर्णता के लिए, यहां पूरा कोड है:

export class TopMenuController implements angular.IController {
  static $inject = ["$templateCache", "Restangular"];

  $onInit() { }

  constructor(
      private readonly $templateCache: angular.ITemplateCacheService,
      private readonly restangular: Restangular.IElement) {
  }
}

हम टाइपस्क्रिप्ट 2.2 का उपयोग कर रहे थे। 2.4 तक अपग्रेड करने के बाद, अब हम इसे संकलन पर प्राप्त करते हैं:

त्रुटि TS2345: प्रकार 'टाइपो टॉपमेनू कंट्रोलर' का तर्क 'इंजेक्शन योग्य <IControllerConstructor>' प्रकार के पैरामीटर के लिए असाइन करने योग्य नहीं है। टाइप करें 'typeof TopMenuController' टाइप करने के लिए असाइन नहीं किया जा सकता है '(स्ट्रिंग | (नया (... args: any []) => IController) | ((args: any []) => शून्य | IController)) [ ] '। संपत्ति 'पुश' टाइप प्रकार 'TopMenuController' में गायब है।

ts \ नियंत्रक \ TopMenuController.ts (2,18): त्रुटि TS2559: 'TopMenuController' टाइप करें 'IController' प्रकार के साथ सामान्य में कोई गुण नहीं है।

मैं पहली त्रुटि को समझ नहीं पा रहा हूं और गुगलिंग करना मुश्किल रहा है। मैं केवल पहली त्रुटि के साथ सहायता मांग रहा हूं। (मुझे पहले को हल करने के अपने प्रयासों के कारण दूसरी त्रुटि मिल रही है)। यहां नियंत्रक है:

export class TopMenuController implements angular.IController {
    static $inject = ["$templateCache", "Restangular"];

    constructor(
        private readonly $templateCache: angular.ITemplateCacheService,
        private readonly restangular: Restangular.IElement) {
    }
}

और इस तरह यह पंजीकृत है।

angular.module("ngApp")
    .config(Configuration.TemplateCacheConfigurator)
    .controller("topMenuController", Controllers.TopMenuController)

मैं अपनी नियंत्रक परिभाषा या उसके पंजीकरण को कैसे संशोधित करूं ताकि हमारा कोड फिर से संकलित हो?

( implements angular.IController को हटा रहा है। implements angular.IController बिट दूसरी त्रुटि को हटा देता है, लेकिन पहला अवशेष)

संपादित करें: मुझे यह बग मिला


मुझे भी उसी मुद्दे का सामना करना पड़ा जिसे मैंने हल किया

  • IController लागू IController

  • कन्स्ट्रक्टर से पहले इस कोड को जोड़ें ( या कोड में कहीं भी यह मेरी वरीयता है ) $onInit = () => { };

यहां पूरा कोड है, उम्मीद है कि यह एक स्पष्ट दृश्य देगा

module MyApp {
    export class HomeController implements angular.IController {
        $onInit = () => { };
        user: string;
        constructor() {
            this.user = "mali";
        }
    }
    angular.module('app').controller('homeController', MyApp.HomeController)
}

हैप्पी कोडिंग


एक और समान समाधान, जो "0" (जैसे "अनसेट") को छोड़ नहीं देता है । फ़िल्टर (संख्या) का उपयोग करना आईएमएचओ एक अच्छा दृष्टिकोण नहीं है।

@Component({
  selector: 'my-app',
  providers: [],
  template: `
  <select>
    <option *ngFor="let key of keys" [value]="key" [label]="countries[key]"></option>
  </select>`,
  directives: []
})

export class App {
  countries = CountryCodeEnum;

  constructor() {
    this.keys = Object.keys(this.countries).filter(f => !isNaN(Number(f)));
  }
}

// ** NOTE: This enum contains 0 index **
export enum CountryCodeEnum {
   Unset = 0,
   US = 1,
   EU = 2
}






angularjs typescript typescript2.0