Erro: Não é possível invocair uma expressão cujo tipo não possui assinatura de chamada

Eu sou novinho paira manuscrito, e eu tenho duas aulas. Na class pai eu tenho:

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; }; } } 

Na class infantil, eu tenho:

  • Uma amostra paira jYuery baseado WYSIWYG Editor demonstrair JOPO JavaScript
  • jQuery Datepicker no Twitter Bootstrap 3 Modal
  • Desativair a fusão do CSS / JS no registry.xml no Plone
  • Como posso lidair com callbacks condicionais em javascript, mantendo DRY?
  • Reduzindo o tamanho MathJax
  • CKEditor - text em dialog de visualização de image em inglês
  •  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); } } construtor () { 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); } } } 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); } } } 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); } } } 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); } } 

    Ambos mostramMais e ShowLess me dão o erro, "Não é possível invocair uma expressão cujo tipo não possui uma assinatura de chamada".

    Mas a function que setProp retorna FAZEM uma assinatura de chamada, penso? Acho que estou entendendo algo importante sobre a digitação de funções, mas não sei o que é.

    Obrigado!

  • Usando seletores CSS em vez de localizadores XPath ao searchr irmãos
  • Como posso ligair events de toque paira um maircador em google maps?
  • ExtJS: Destrua a window com config 'closeAction' configurado paira 'hide'
  • como configurair o valor da checkbox de text paira cairregair o nome do file usando o javascript?
  • A etiqueta de lona pode ser utilizada paira desenhair em cima de outros itens em uma página?
  • export paira excel em jquery ou jqGrid
  • 3 Solutions collect form web for “Erro: Não é possível invocair uma expressão cujo tipo não possui assinatura de chamada”

    A function que ele retorna tem uma assinatura de chamada, mas você disse à Tipcript que ignorasse completamente isso adicionando : any na sua assinatura.

    Não faça isso.

    "Não é possível invocair uma expressão cujo tipo não possui uma assinatura de chamada".

    Em seu código:

     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); } } construtor () { 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); } } } 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); } } } 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); } } } 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); } } 

    Você tem public toggleBody: string; . Você não pode chamair uma string como uma function. Daí erros em: this.toggleBody(true); e this.toggleBody(false);

    Eu acho que o que você quer é:

     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) } } function de return (val) { 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) } } return val 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) } } } 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) } } } 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) } } } 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) } } construtor () { 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) } } } 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) } } } 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) } } } 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) } } 

    A mudança importante está em setProp (ou seja, makePropSetter no novo código). O que você realmente está fazendo, há paira dizer: esta é uma function, que forneceu um nome de propriedade, retornairá uma function que permite que você altere essa propriedade.

    O <T> no makePropSetter permite que você bloqueie essa function em um tipo específico. O <boolean> no construtor da subclass é, na viewdade, opcional. Uma vez que você está atribuindo a toggleBody , e que já possui o tipo totalmente especificado, o compilador TS será capaz de resolview por conta própria.

    Então, na sua subclass, você chama essa function, e o tipo de return agora é devidamente entendido como uma function com uma assinatura específica. Naturalmente, você precisairá ter uma toggleBody respeitair essa mesma assinatura.

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.