source

TypeScript 업그레이드 후 Angular 컨트롤러 등록이 컴파일되지 않음

ittop 2023. 3. 23. 23:08
반응형

TypeScript 업그레이드 후 Angular 컨트롤러 등록이 컴파일되지 않음

TypeScript 2.2를 사용하고 있었습니다.2.4로 업그레이드한 후 컴파일에 다음과 같이 표시됩니다.

오류 TS2345: 'type of TopMenuController' 유형의 인수를 'Injectable' 유형의 매개 변수에 할당할 수 없습니다.IController Constructor >'를 참조해 주세요.'type of TopMenuController' 유형은 '(string | (...sys: any[] => I콘트롤러)' | (...sys: any[] => void | I콘트롤러) []' 유형에는 'type of TopMenuController' 속성 '이 없습니다.

ts\controllers\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.IControllerbit는 두 번째 오류를 제거하지만 첫 번째 오류는 그대로 남습니다.)

편집: 버그를 찾았습니다.

의 모든 속성이IController옵션입니다.이 에러는 TypeScript 2.4의 "Weak Types"에 대한 새로운 체크 결과라고 생각합니다.상세한 것에 대하여는, Microsoft 의 링크를 참조해 주세요.관련된 Github 문제도 확인해 주세요.

Microsoft의 관련 인용문:

TypeScript 2.4에서는 소위 약한 타입에 대해 유사한 체크를 추가하고 있습니다.옵션 속성만 포함하는 유형은 할당할 수 있는 항목에 대한 제한이 거의 없기 때문에 취약한 유형으로 간주됩니다.

...

TypeScript 2.4에서는 속성이 중복되지 않을 때 취약한 유형에 할당하는 것은 오류가 됩니다.

...

이를 TypeScript가 사일런트 버그를 검출하기 위해 이러한 유형의 취약한 보증을 "개선"하는 것으로 생각할 수 있습니다.

이것은 중대한 변경이기 때문에 엄밀한 오브젝트 리터럴체크 회피책과 같은 회피책에 대해 알아야 할 경우가 있습니다.

  1. 속성이 실제로 존재하는 경우 선언합니다.
  2. 인덱스 서명을 취약한 유형(예: [propName: string]: {})에 추가합니다.
  3. 형식 어설션을 사용합니다(즉, 옵션으로 선택).

편집: 이 정보를 바탕으로 간단한 솔루션은 에서 정의된 방법 중 하나를 구현하는 것입니다.IController를 들어 빈 @Amy를 할 수 $onInit메서드를 지정합니다.

편집: 완전성을 위해 코드 전체를 다음에 나타냅니다.

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

  $onInit() { }

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

나 또한 같은 문제에 직면했고, 그로 인해 해결되었다.

  • 의 실장IController

  • 이 코드를 컨스트럭터 앞에 추가합니다(또는 코드 내의 임의의 위치에 추가합니다).$onInit = () => { };

여기 전체 코드가 있습니다. 이것이 명확한 시야를 제공하길 바랍니다.

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

해피 코딩

다음 코드를 추가하여 문제를 해결합니다.

$onInit = () => { };

언급URL : https://stackoverflow.com/questions/44803945/after-upgrading-typescript-angular-controller-registration-now-fails-to-compile

반응형