웹사이트 검색

javascript - 오류: 호출 서명이 없는 타입의 표현식을 호출할 수 없습니다


저는 타입스크립트에 완전히 새롭고, 두 개의 클래스가 있습니다. 부모 클래스에는 다음과 같이 있습니다:

abstract class Component {
  public deps: any = {};
  public props: any = {};

  public setProp(prop: string): any {
    return <T>(val: T): T => {
      this.props[prop] = val;
      return val;
    };
  }
}

자식 클래스에는 다음과 같이 있습니다:

class Post extends Component {
  public toggleBody: string;

  constructor() {
    this.toggleBody = this.setProp('showFullBody');
  }

  public showMore(): boolean {
    return this.toggleBody(true);
  }

  public showLess(): boolean {
    return this.toggleBody(false);
  }
}

showMore와 ShowLess 모두 저에게 "호출 서명이 없는 타입의 표현식을 호출할 수 없습니다."라는 오류를 줍니다.

하지만 setProp가 반환하는 함수는 호출 시그니처를 가지고 있는 것 같아요, 맞나요? 함수의 타입에 대해 뭔가 중요한 것을 제가 오해하고 있는 것 같은데, 그게 뭔지 모르겠어요.

고마워!

답변 #1

그것이 반환하는 함수는 호출 시그니처를 가지고 있지만, 당신은 시그니처에 : any를 추가하여 Typescript가 그것을 완전히 무시하도록 지시했습니다.

답변 #2

호출 서명이 없는 타입의 표현식을 호출할 수 없습니다.

당신의 코드에서 :

class Post extends Component {
  public toggleBody: string;

  constructor() {
    this.toggleBody = this.setProp('showFullBody');
  }

  public showMore(): boolean {
    return this.toggleBody(true);
  }

  public showLess(): boolean {
    return this.toggleBody(false);
  }
}

당신은 public toggleBody: string;를 가지고 있습니다. string을 함수처럼 호출할 수 없습니다. 따라서 this.toggleBody(true);와 this.toggleBody(false);에서 오류가 발생합니다.

답변 #3

이걸 나눠서 살펴봅시다:

  1. 오류 메시지는

    호출 서명이 없는 형식의 표현식을 호출할 수 없습니다.

  2. 코드:

문제는 이 줄 public toggleBody: string; & 에 있습니다

이 줄들과의 관련성:

...
return this.toggleBody(true);
...
return this.toggleBody(false);
  1. 결과:

당신은 toggleBody가 string이라고 말하고 있지만, 그것을 call signature를 가진 것으로 다루고 있습니다(즉, 호출할 수 있는 구조: 람다, 프로시저, 함수, 메서드 등. JS에서는 그냥 함수입니다.). 선언을 public toggleBody: (arg: boolean) => boolean;로 변경해야 합니다.

추가 세부 정보:

"invoke"는 함수를 호출하거나 적용하는 것을 의미합니다.

Javascript에서 "an expression"은 기본적으로 값을 생성하는 것을 의미하므로, this.toggleBody()도 expression으로 간주됩니다.

"type"는 이 줄 public toggleBody: string에서 선언됩니다

"호출 서명이 없습니다(lacks a call signature)"라는 것은 호출할 수 있는 구조(람다, 프로시저, 함수, 메서드 등)를 가지지 않은 this.toggleBody()를 호출하려고 시도했기 때문입니다. 당신은 this.toggleBody가 문자열처럼 작동한다고 말했습니다.

다시 말해, 그 오류는 이렇게 말하고 있습니다

식(this.toggleBody)을 호출할 수 없습니다. 해당 타입(:string)은 호출 서명이 없기 때문입니다(문자열 서명이 있기 때문입니다).

관련기사