TypeScript의 Constructor 내부에서 할당하는 method를 호출하면 TypeScript가 인식을 하지 못합니다.

조회수 440회
class Block{
    // Implements about block. internal.
    blockProperties: Object;

    constructor(){
        this.applyBlockPrototype();
    }

    applyBlockPrototype(): void{
        this.blockProperties = new Object();
    }
}

이런 코드가 있을 시에, blockProperties 가 초기화 되어있지 않다고 컴파일도 안되고, IDE 에서도 빨간줄로 쭉 나옵니다.

하지만 똑같은 논리인데, 이렇게 하면 오류가 없습니다.

class Block{
    // Implements about block. internal.
    blockProperties: Object;

    constructor(){
        this.blockProperties = new Object();
    }
}

도대체 제가 무엇을 잘못 했을까요?

  • class를 추상화할때 `implements` 키워드는 사용하고싶은 interface가 가지고 있는 멤버만 사용할 수 있어요. `extends`로 키워드를 변경하면 `applyBlockPrototype`를 멤버로 추가하실 수 있을거에요. 알 수 없는 사용자 2020.7.23 13:04
  • 아 본래 코드에서 필요없는 코드 부분들을 잘라서 예제로 나타내다 보니 이렇게 나타난 것 같습니다. 본래의 문제랑은 큰 상관이 없는 것 같습니다. 하지만 코드의 필요없는 그 부분도 수정하도록 하겠습니다. 감사합니다. dbwodlf3 2020.7.23 13:38

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    TypeScript Playground(v3.9.2) 에서 테스트 해본 결과 네 가지 해결 방법.

    아래 옵션들 중 하나를 Off

    from Quick Fix...

    • blockProperties!: Object (구 버전에서는 ! 인식이 안 될 수 있음)
    • blockProperties!: Object | undefined
    • TypeScript가 아직 이런 부분에 대한 Support를 제대로 하지 못하는 것이지요? 그 부분이 궁금했습니다. 내가 잘못했는지, TypeScript가 잘못했는지... 음. TypeScript 에서도 이 문제를 인지하고 있고, 다른 해법을 제시하는 것 같군요. 친절한 답변 감사합니다. dbwodlf3 2020.7.23 15:00
    • 아마 사용자 각자의 컨벤션이 있으니 transpiling 옵션으로 넣어 뒀을 겁니다.. --strictPropertyInitialization만 off하면 문제없이 잘 사용하실 수 있을 것 같은데요. 잘/잘못은 따지기 보다는 버전업 하면서 해당 옵션을 지원해 줬다는데에 의의를 두시는건 어떨지요. doodoji 2020.7.23 15:11
    • 물론 설정이 조금 귀찮긴 합니다. 이건 개인적인 의견입니다만... 정적 타이핑 프로그래밍을 위해서라면 일부 타이핑을 위한 문법이나 요령, workaround, 몇몇 hacks은 인지하시고 사용시 그 번거로움을 감수 하셔야 할 부분인 것 같습니다. TypeScript도 완벽하지는 않으니까요. 일단은 IDE의 suggest나 quick fix의 도움을 최대한 받으세요. doodoji 2020.7.23 15:14
    • ^^. dbwodlf3 2020.7.23 17:07

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)