Jestem zupełnie nowy w maszynopisie i mam dwie klasy. W klasie rodzicielskiej mam:
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;
};
}
}
W klasie dziecięcej mam:
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);
}
}
Zarówno showMore, jak i ShowLess wyświetlają błąd „Nie można wywołać wyrażenia, którego typ nie ma sygnatury wywołania”.
Ale myślę, że funkcja, którą zwraca setProp, CZY ma sygnaturę wywołania? Myślę, że źle rozumiem coś ważnego w typowaniu funkcji, ale nie wiem, co to jest.
Dzięki!
javascript
angularjs
typescript
types
Justin
źródło
źródło
togglrBody
nie powinien być łańcuchem, ponieważ chcesz, aby był to funkcja<T>(val: T) => T
Odpowiedzi:
Funkcja, którą zwraca, ma sygnaturę wywołania, ale powiedziałeś Typescriptowi, aby całkowicie to zignorował, dodając
: any
jego podpis.Nie rób tego.
źródło
public toggleBody: boolean;
dopublic toggleBody: any;
to działa.this.toggleBody
powinno zostać zwróconeboolean
, ale nie jest to zgodne z wartością zwracanąsetProp
, którą mu przypisałeś. Wydaje się, że po prostu losowo wrzucasz typy, nie myśląc o tym, co tak naprawdę chcesz wysłać, a co zwrócić.W swoim kodzie:
Masz
public toggleBody: string;
. Nie możesz wywołać funkcji astring
jako funkcji. Stąd błędy na:this.toggleBody(true);
ithis.toggleBody(false);
źródło
Rozbijmy to:
Błąd mówi
Kod:
Problem tkwi w tej linii
public toggleBody: string;
ijest to związek z tymi liniami:
Twoje powiedzenie
toggleBody
jest a,string
ale wtedy traktujesz je jak coś, co macall signature
(tj. Strukturę czegoś, co można nazwać: lambdy, proc, funkcje, metody, itd.). Musisz zmienić deklarację napublic toggleBody: (arg: boolean) => boolean;
.Dodatkowe szczegóły:
„Wywołaj” oznacza wywołanie lub zastosowanie funkcji.
„Wyrażenie” w JavaScript jest w zasadzie czymś, co generuje wartość, więc
this.toggleBody()
liczy się jako wyrażenie.W tym wierszu zadeklarowano „typ”
public toggleBody: string
„Brak sygnatury wywołania”
this.toggleBody()
dzieje się tak, ponieważ próbujesz wywołać coś , co nie ma sygnatury (tj. strukturę czegoś, co można nazwać: lambdy, proc, funkcje, metody itp.), co można wywołać. Powiedziałeś, żethis.toggleBody
to coś, co działa jak sznurek.Innymi słowy, błąd mówi
źródło
Myślę, że chcesz:
Nadeszła ważna zmiana
setProp
(tjmakePropSetter
. Nowego kodu). To, co naprawdę robisz, to powiedzenie: jest to funkcja, której podana jest nazwa właściwości, zwróci funkcję, która umożliwia zmianę tej właściwości.Opcja
<T>
onmakePropSetter
umożliwia zablokowanie tej funkcji w określonym typie. Konstruktor<boolean>
w podklasie jest w rzeczywistości opcjonalny. Ponieważ przydzielasz dotoggleBody
, a typ jest już w pełni określony, kompilator TS będzie mógł go samodzielnie rozwiązać.Następnie w swojej podklasie wywołujesz tę funkcję, a typ zwracany jest teraz właściwie rozumiany jako funkcja z określonym podpisem. Oczywiście musisz
toggleBody
uszanować ten sam podpis.źródło
Oznacza to, że próbujesz wywołać coś, co nie jest funkcją
źródło
Dodaj typ do zmiennej, a następnie zwróć.
Na przykład:
=> Ważną częścią jest dodanie ciągu [] typ itp:
źródło
Miałem ten sam komunikat o błędzie. W moim przypadku nieumyślnie pomieszałem
export default function myFunc
składnię ES6 zconst myFunc = require('./myFunc');
.Użycie
module.exports = myFunc;
zamiast tego rozwiązało problem.źródło
Ten błąd może być spowodowany, gdy żądasz od czegoś wartości i umieszczasz nawias na końcu, tak jakby to było wywołanie funkcji, ale wartość jest poprawnie pobierana bez kończenia nawiasu. Na przykład, jeśli uzyskujesz dostęp do Property „get” w Typescript.
źródło