Eu sou novo em datilografado e tenho duas classes. Na classe 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 classe infantil, tenho:
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 e ShowLess me dão o erro "Não é possível invocar uma expressão cujo tipo não possui assinatura de chamada".
Mas a função que setProp retorna TEM uma assinatura de chamada, eu acho? Acho que estou entendendo mal algo importante sobre tipos de funções, mas não sei o que é.
Obrigado!
javascript
angularjs
typescript
types
Justin
fonte
fonte
togglrBody
não deve ser uma string, desde que você quer que ele seja uma função<T>(val: T) => T
Respostas:
A função que ele retorna possui uma assinatura de chamada, mas você disse ao Typescript para ignorá-lo completamente, adicionando
: any
sua assinatura.Não faça isso.
fonte
public toggleBody: boolean;
parapublic toggleBody: any;
ele funciona.this.toggleBody
deve retornarboolean
, mas isso não é consistente com o valor de retornosetProp
atribuído a ele. Parece que você está jogando aleatoriamente tipos sem pensar no que realmente deseja enviar e retornar.No seu código:
Você tem
public toggleBody: string;
. Você não pode chamar astring
como uma função. Daí erros em:this.toggleBody(true);
ethis.toggleBody(false);
fonte
Vamos dividir isso:
O erro diz
O código:
O problema está nesta linha
public toggleBody: string;
eé relação com estas linhas:
Seu ditado
toggleBody
é um,string
mas então você o trata como algo que tem umcall signature
(ou seja, a estrutura de algo que pode ser chamado: lambdas, proc, funções, métodos, etc. No JS, apenas funciona tho.). Você precisa alterar a declaração para serpublic toggleBody: (arg: boolean) => boolean;
.Detalhes extras:
"invocar" significa sua chamada ou aplicação de uma função.
"uma expressão" em Javascript é basicamente algo que produz um valor, então
this.toggleBody()
conta como uma expressão."type" é declarado nesta linha
public toggleBody: string
"falta uma assinatura de chamada" é porque você está tentando chamar algo
this.toggleBody()
que não tem assinatura (ou seja, a estrutura de algo que pode ser chamado: lambdas, proc, funções, métodos, etc.) que podem ser chamados. Você disse quethis.toggleBody
é algo que age como uma corda.Em outras palavras, o erro está dizendo
fonte
Eu acho que o que você quer é:
A mudança importante está em
setProp
(ou seja,makePropSetter
no novo código). O que você realmente está fazendo lá é dizer: esta é uma função, que é fornecida com um nome de propriedade, retornará uma função que permite alterar essa propriedade.O
<T>
onmakePropSetter
permite bloquear essa função em um tipo específico. O<boolean>
construtor da subclasse é realmente opcional. Como você está atribuindo atoggleBody
, e que já possui o tipo totalmente especificado, o compilador TS poderá resolver isso sozinho.Em sua subclasse, você chama essa função e o tipo de retorno agora é entendido como uma função com uma assinatura específica. Naturalmente, você precisará
toggleBody
respeitar a mesma assinatura.fonte
Isso significa que você está tentando chamar algo que não é uma função
fonte
Adicione um tipo à sua variável e, em seguida, retorne.
Por exemplo:
=> Parte importante é adicionar o tipo de string [] etc:
fonte
Eu tive a mesma mensagem de erro. No meu caso, misturei inadvertidamente a
export default function myFunc
sintaxe do ES6const myFunc = require('./myFunc');
.O uso
module.exports = myFunc;
resolveu o problema.fonte
Este erro pode ser causado quando você solicita um valor de alguma coisa e coloca parênteses no final, como se fosse uma chamada de função, mas o valor é recuperado corretamente sem terminar o parêntese. Por exemplo, se o que você está acessando é uma propriedade 'get' no TypeScript.
fonte