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.IController
bit는 두 번째 오류를 제거하지만 첫 번째 오류는 그대로 남습니다.)
의 모든 속성이IController
옵션입니다.이 에러는 TypeScript 2.4의 "Weak Types"에 대한 새로운 체크 결과라고 생각합니다.상세한 것에 대하여는, Microsoft 의 링크를 참조해 주세요.관련된 Github 문제도 확인해 주세요.
Microsoft의 관련 인용문:
TypeScript 2.4에서는 소위 약한 타입에 대해 유사한 체크를 추가하고 있습니다.옵션 속성만 포함하는 유형은 할당할 수 있는 항목에 대한 제한이 거의 없기 때문에 취약한 유형으로 간주됩니다.
...
TypeScript 2.4에서는 속성이 중복되지 않을 때 취약한 유형에 할당하는 것은 오류가 됩니다.
...
이를 TypeScript가 사일런트 버그를 검출하기 위해 이러한 유형의 취약한 보증을 "개선"하는 것으로 생각할 수 있습니다.
이것은 중대한 변경이기 때문에 엄밀한 오브젝트 리터럴체크 회피책과 같은 회피책에 대해 알아야 할 경우가 있습니다.
- 속성이 실제로 존재하는 경우 선언합니다.
- 인덱스 서명을 취약한 유형(예: [propName: string]: {})에 추가합니다.
- 형식 어설션을 사용합니다(즉, 옵션으로 선택).
편집: 이 정보를 바탕으로 간단한 솔루션은 에서 정의된 방법 중 하나를 구현하는 것입니다.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
'source' 카테고리의 다른 글
Safari 브라우저에서 웹 사이트가 제대로 로드되지 않음 (0) | 2023.03.23 |
---|---|
레이아웃을 중단하지 않고 버튼 그룹 내에서 비활성화된 MUI 버튼에 툴팁을 렌더링할 수 있습니까? (0) | 2023.03.23 |
JS 오브젝트에 대한 JSON 문자열 (0) | 2023.03.18 |
Swift 4 디코딩 시간까지 알 수 없는 키로 디코딩 가능 (0) | 2023.03.18 |
github API에서 링크 헤더를 해석하는 방법 (0) | 2023.03.18 |