Ich bin brandneu im Typoskript und habe zwei Klassen. In der Elternklasse habe ich:
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;
};
}
}
In der Kinderklasse habe ich:
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);
}
}
Sowohl showMore als auch ShowLess geben mir den Fehler "Kann keinen Ausdruck aufrufen, dessen Typ keine Aufrufsignatur hat."
Aber die Funktion, die setProp zurückgibt, hat eine Aufrufsignatur, denke ich? Ich glaube, ich verstehe etwas Wichtiges über die Eingabe von Funktionen falsch, aber ich weiß nicht, was es ist.
Vielen Dank!
javascript
angularjs
typescript
types
Justin
quelle
quelle
togglrBody
sollte keine Zeichenfolge sein, da Sie möchten, dass es eine Funktion ist<T>(val: T) => T
Antworten:
Die zurückgegebene Funktion hat eine Aufrufsignatur, aber Sie haben Typescript angewiesen, diese vollständig zu ignorieren, indem Sie
: any
die Signatur hinzufügen .Tu das nicht.
quelle
public toggleBody: boolean;
,public toggleBody: any;
funktioniert es.this.toggleBody
sollten zurückkehrenboolean
, aber das stimmt nicht mit dem Rückgabewert übereinsetProp
, den Sie ihm zugewiesen haben. Sie scheinen nur zufällig Typen einzuwerfen, ohne darüber nachzudenken, was Sie tatsächlich senden und zurückgeben möchten.In Ihrem Code:
Du hast
public toggleBody: string;
. Sie können a nichtstring
als Funktion aufrufen . Daher Fehler bei:this.toggleBody(true);
undthis.toggleBody(false);
quelle
Lassen Sie uns das zusammenfassen:
Der Fehler sagt
Der Code:
Das Problem liegt in dieser Zeile
public toggleBody: string;
&es ist die Beziehung zu diesen Zeilen:
Ihr Sprichwort
toggleBody
ist ein,string
aber dann behandeln Sie es wie etwas, das ein hatcall signature
(dh die Struktur von etwas, das genannt werden kann: Lambdas, Proc, Funktionen, Methoden usw. In JS funktionieren Sie einfach tho.). Sie müssen die Deklaration ändern, um zu seinpublic toggleBody: (arg: boolean) => boolean;
.Zusätzliche Details:
"aufrufen" bedeutet, dass Sie eine Funktion aufrufen oder anwenden.
"ein Ausdruck" in Javascript ist im Grunde etwas, das einen Wert erzeugt, also
this.toggleBody()
als Ausdruck zählt.In dieser Zeile wird "Typ" deklariert
public toggleBody: string
"Fehlt eine Anrufsignatur" Dies liegt daran, dass Sie versuchen, etwas aufzurufen
this.toggleBody()
, das keine Signatur hat (dh die Struktur von etwas, das aufgerufen werden kann: Lambdas, Proc, Funktionen, Methoden usw.), das aufgerufen werden kann. Sie sagten, esthis.toggleBody
ist etwas, das sich wie eine Schnur verhält.Mit anderen Worten, der Fehler sagt
quelle
Ich denke, was Sie wollen, ist:
Die wichtige Änderung ist in
setProp
(dhmakePropSetter
im neuen Code). Was Sie dort wirklich tun, ist zu sagen: Dies ist eine Funktion, die mit einem Eigenschaftsnamen versehen ist und eine Funktion zurückgibt, mit der Sie diese Eigenschaft ändern können.Die
<T>
aufmakePropSetter
können Sie diese Funktion , um eine bestimmte Art sperren. Der<boolean>
Konstruktor in der Unterklasse ist tatsächlich optional. Da Sie zuweisentoggleBody
und der Typ bereits vollständig angegeben ist, kann der TS-Compiler ihn selbst erarbeiten.Dann rufen Sie in Ihrer Unterklasse diese Funktion auf, und der Rückgabetyp wird nun ordnungsgemäß als Funktion mit einer bestimmten Signatur verstanden. Natürlich müssen Sie
toggleBody
dieselbe Unterschrift respektieren.quelle
Es bedeutet, dass Sie versuchen, etwas aufzurufen, das keine Funktion ist
quelle
Fügen Sie Ihrer Variablen einen Typ hinzu und kehren Sie dann zurück.
Z.B:
=> Wichtiger Teil ist das Hinzufügen des Typs string [] usw.:
quelle
Ich hatte die gleiche Fehlermeldung. In meinem Fall hatte ich versehentlich die ES6-
export default function myFunc
Syntax mit gemischtconst myFunc = require('./myFunc');
.Die Verwendung von
module.exports = myFunc;
stattdessen löste das Problem.quelle
Dieser Fehler kann verursacht werden, wenn Sie einen Wert von etwas anfordern und am Ende eine Klammer setzen, als wäre es ein Funktionsaufruf. Der Wert wird jedoch korrekt abgerufen, ohne die Klammer zu beenden. Wenn Sie beispielsweise auf eine Eigenschaft 'get' in Typescript zugreifen.
quelle