오류: 유형에 콜 시그니처가 없는 식을 호출할 수 없습니다.
나는 타자본을 처음 접하고 두 개의 수업이 있다.부모 클래스에는 다음이 있습니다.
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 모두 "Cannot incall a expression that type with a call signature" (타입에 콜시그니처가 없는 타입의 식을 호출할 수 없습니다.
하지만 set Prop가 반환하는 함수는 호출 서명이 있는 것 같습니다.함수의 타이핑에 대해 뭔가 중요한 것을 잘못 알고 있는 것 같습니다만, 그것이 무엇인지 모르겠습니다.
감사합니다!
반환되는 함수에 콜시그니처가 있는데 Typescript에 콜시그니처를 추가해서 완전히 무시하도록 지시했습니다: any그 서명에.
"타입에 콜 시그니처가 없는 식을 호출할 수 없습니다."
코드:
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);
이 점에 대해 설명하겠습니다.
에러는 다음과 같습니다.
유형에 콜 시그니처가 없는 식을 호출할 수 없습니다.
코드:
문제는 이 라인에 있습니다.public toggleBody: string;&
다음 라인에 대한 관계입니다.
...
return this.toggleBody(true);
...
return this.toggleBody(false);
- 그 결과:
당신의 속담toggleBody는 입니다.string하지만 당신은 그걸 마치...call signature(즉, lamdas, proc, 함수, 방법 등이라고 부를 수 있는 것의 구조).JS에서는 기능만 합니다.)선언을 다음과 같이 변경해야 합니다.public toggleBody: (arg: boolean) => boolean;.
기타 상세:
"기능"은 기능을 호출하거나 적용하는 것을 의미합니다.
Javascript의 "표현"은 기본적으로 가치를 창출하는 것이기 때문에this.toggleBody()표현으로 간주됩니다.
이 라인에 "type"이 선언되었습니다.public toggleBody: string
'콜 시그니처 변경' 이것은 당신이 무언가를 호출하려고 하기 때문입니다.this.toggleBody()호출할 수 있는 시그니처(즉, lamdas, proc, 함수, 메서드 등)가 없는 경우.당신은 말했다.this.toggleBody끈과 같은 역할을 하는 것입니다.
즉, 에러는
형식(:string)에 호출 서명이 없기 때문에 식(this.toggleBody)을 호출할 수 없습니다(bc 문자열 서명이 있음).
즉, 함수가 아닌 것을 호출하려고 하는 것입니다.
const foo = 'string'
foo() // error
네가 원하는 건
abstract class Component {
public deps: any = {};
public props: any = {};
public makePropSetter<T>(prop: string): (val: T) => T {
return function(val) {
this.props[prop] = val
return val
}
}
}
class Post extends Component {
public toggleBody: (val: boolean) => boolean;
constructor () {
super()
this.toggleBody = this.makePropSetter<boolean>('showFullBody')
}
showMore (): boolean {
return this.toggleBody(true)
}
showLess (): boolean {
return this.toggleBody(false)
}
}
중요한 변화는 에 있다.setProp(즉,makePropSetter새로운 코드로)를 참조해 주세요.여기서 실제로 하는 일은 속성 이름과 함께 제공되는 함수로 해당 속성을 변경할 수 있는 함수가 반환됩니다.
<T>makePropSetter를 사용하면 해당 기능을 특정 유형으로 잠글 수 있습니다.<boolean>서브클래스의 컨스트럭터에서는, 실제로는 옵션입니다.toggleBody타입이 이미 완전히 지정되어 있기 때문에 TS 컴파일러는 스스로 해결할 수 있습니다.
그런 다음 서브클래스에서 해당 함수를 호출하면 반환 유형이 특정 시그니처를 가진 함수로 올바르게 인식됩니다.아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.toggleBody동일한 서명을 존중합니다.
이 에러는, 값을 요구하고 있을 때에, 마치 함수 호출인 것처럼 마지막에 괄호를 붙여도, 괄호를 종료하지 않고 값이 올바르게 취득되고 있는 경우에 발생할 가능성이 있습니다.예를 들어, 액세스하는 항목이 유형 스크립트의 속성 '가져오기'인 경우.
private IMadeAMistakeHere(): void {
let mynumber = this.SuperCoolNumber();
}
private IDidItCorrectly(): void {
let mynumber = this.SuperCoolNumber;
}
private get SuperCoolNumber(): number {
let response = 42;
return response;
};
변수에 유형을 추가한 다음 반환하십시오.
예:
const myVariable : string [] = ['hello', 'there'];
const result = myVaraible.map(x=> {
return
{
x.id
}
});
=> 중요한 부분은 문자열 []타입 등을 추가하는 것입니다.
이치노를 잘못 .export default function myFunc합니다.const myFunc = require('./myFunc');.
「」를 사용합니다.module.exports = myFunc;대신 문제를 해결했다.
언급URL : https://stackoverflow.com/questions/39691889/error-cannot-invoke-an-expression-whose-type-lacks-a-call-signature
'IT' 카테고리의 다른 글
| RestTemplate와 비교하여 가장을 사용할 경우의 장점과 단점은 무엇입니까? (0) | 2023.02.22 |
|---|---|
| 반응: 정적 propType이 필요한 이유 (0) | 2023.02.22 |
| Spring Boot 서비스 (0) | 2023.02.22 |
| tsconfig의 "target" 및 "module"에 대해 (0) | 2023.02.22 |
| 각진 경우 ng-if angular로 일회성 바인딩? (0) | 2023.02.22 |