Я новичок в машинописи, и у меня два класса. В родительском классе у меня есть:
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, имеет подпись вызова? Я думаю, что неправильно понимаю что-то важное о типизации функций, но я не знаю, что это такое.
Спасибо!
javascript
angularjs
typescript
types
Джастин
источник
источник
togglrBody
не должно быть строкой, так как вы хотите, чтобы это была функция<T>(val: T) => T
Ответы:
Функция, которую он возвращает, имеет сигнатуру вызова, но вы сказали Typescript полностью игнорировать это, добавив
: any
в свою сигнатуру.Не делай этого.
источник
public toggleBody: boolean;
наpublic toggleBody: any;
него, это будет работать.this.toggleBody
возвратаboolean
, но это не соответствует возвращаемому значению,setProp
которое вы ему присвоили. Кажется, вы просто случайным образом набрасываете типы, не думая о том, что вы действительно хотите отправить и вернуть.В вашем коде:
У тебя есть
public toggleBody: string;
. Вы не можете вызвать astring
как функцию. Отсюда ошибки:this.toggleBody(true);
иthis.toggleBody(false);
источник
Давайте разберем это:
Ошибка говорит
Код:
Проблема в этой строке
public toggleBody: string;
&это отношение к этим строкам:
Ваше высказывание
toggleBody
- это,string
но тогда выcall signature
относитесь к нему как к чему-то, что имеет (т.е. структуру чего-то, что может быть вызвано: лямбды, процедуры, функции, методы и т. Д. В JS просто функция tho.). Вам нужно изменить декларацию наpublic toggleBody: (arg: boolean) => boolean;
.Дополнительные детали:
"invoke" означает ваш вызов или применение функции.
"выражение" в Javascript - это по сути то, что производит значение, поэтому
this.toggleBody()
считается выражением."тип" объявлен в этой строке
public toggleBody: string
«не хватает сигнатуры вызова», потому что вы пытаетесь вызвать что-то,
this.toggleBody()
что не имеет сигнатуры (т.е. структуру чего-то, что может быть вызвано: лямбда-выражения, процедуры, функции, методы и т. д.), которое может быть вызвано. Ты сказалthis.toggleBody
, что это что-то, что действует как струна.Другими словами, ошибка говорит
источник
Я думаю, что вам нужно:
Важное изменение в
setProp
(т. Е.makePropSetter
в новом коде). На самом деле вы здесь говорите: это функция, которой присвоено имя свойства, она вернет функцию, которая позволяет вам изменить это свойство.<T>
НаmakePropSetter
позволяет заблокировать эту функцию , чтобы тип конкретного. Конструктор<boolean>
подкласса не является обязательным. Поскольку вы назначаете объектtoggleBody
, и у него уже есть полностью указанный тип, компилятор TS сможет решить это самостоятельно.Затем в своем подклассе вы вызываете эту функцию, и возвращаемый тип теперь правильно понимается как функция с определенной сигнатурой. Естественно, вам нужно
toggleBody
уважать эту подпись.источник
Это означает, что вы пытаетесь вызвать что-то, что не является функцией
источник
Добавьте тип к своей переменной и затем вернитесь.
Например:
=> Важной частью является добавление типа string [] и т. Д.:
источник
У меня было такое же сообщение об ошибке. В моем случае я случайно перепутал
export default function myFunc
синтаксис ES6 сconst myFunc = require('./myFunc');
.Использование
module.exports = myFunc;
вместо этого решило проблему.источник
Эта ошибка может быть вызвана тем, что вы запрашиваете значение у чего-либо и ставите скобки в конце, как если бы это был вызов функции, но при этом значение извлекается правильно без закрывающих скобок. Например, если вы обращаетесь к свойству "получить" в Typescript.
источник