No TypeScript, posso declarar um parâmetro de uma função como um tipo Function. Existe uma maneira "segura de digitar" de fazer isso que estou perdendo? Por exemplo, considere isso:
class Foo {
save(callback: Function) : void {
//Do the save
var result : number = 42; //We get a number from the save operation
//Can I at compile-time ensure the callback accepts a single parameter of type number somehow?
callback(result);
}
}
var foo = new Foo();
var callback = (result: string) : void => {
alert(result);
}
foo.save(callback);
O retorno de chamada para salvar não é do tipo seguro; estou fornecendo uma função de retorno de chamada em que o parâmetro da função é uma cadeia de caracteres, mas estou passando um número para ele e compilando sem erros. Posso definir o parâmetro result em salvar uma função de segurança de tipo?
Versão TL; DR: existe o equivalente a um delegado .NET no TypeScript?
fonte
(n: number) => any
significa alguma assinatura de função?number
), mas o tipo de retorno não está restrito a todos (poderia ser qualquer valor, ou mesmovoid
)n
dessa sintaxe? Os tipos de entrada e saída não seriam suficientes?Aqui estão os equivalentes TypeScript de alguns delegados .NET comuns:
fonte
Action
eFunc
evitam a maior parte da necessidade de tipos de delegados específicos e, curiosamente, fornecem ao C # uma aparência de tipagem estrutural. A desvantagem desses delegados é que seus nomes não transmitem significado, mas as outras vantagens geralmente superam isso. No TypeScript, simplesmente não precisamos desses tipos. Então o anti-padrão seriafunction map<T, U>(xs: T[], f: Func<T, U>)
. Preferfunction map<T, U>(xs: T[], f: (x: T) => U)
Sei que este post é antigo, mas há uma abordagem mais compacta que é um pouco diferente do que foi solicitado, mas pode ser uma alternativa muito útil. Você pode essencialmente declarar a função in-line ao chamar o método (
Foo
'ssave()
, neste caso). Seria algo como isto:A
multipleCallback()
abordagem é muito útil para coisas como chamadas de rede que podem ter sucesso ou falhar. Novamente, assumindo um exemplo de chamada de rede, quandomultipleCallbacks()
chamado, o comportamento para um sucesso e uma falha pode ser definido em um local, o que se presta a uma maior clareza para futuros leitores de código.Geralmente, na minha experiência, essa abordagem se presta a ser mais concisa, menos confusa e com maior clareza em geral.
Boa sorte a todos!
fonte
Isso certamente está alinhado com o paradigma de programação funcional.
fonte
inputType
vez dereturnType
, não deveria? OndeinputType
é o tipo dodata
qual você passa um parâmetro para acallback
função.No TS, podemos digitar funções das seguintes maneiras:
Tipos de funções / assinaturas
Isso é usado para implementações reais de funções / métodos e possui a seguinte sintaxe:
Exemplo:
Tipo de Função Literais
Literais de tipo de função são outra maneira de declarar o tipo de uma função. Eles geralmente são aplicados na assinatura da função de uma função de ordem superior. Uma função de ordem superior é uma função que aceita funções como parâmetros ou que retorna uma função. Possui a seguinte sintaxe:
Exemplo:
fonte
Se você definir o tipo de função primeiro, pareceria
Sem o tipo de função usando a sintaxe de propriedade simples, seria:
Se você deseja usar uma função de interface como delegados genéricos do c #, seria:
fonte
Além do que outros disseram, um problema comum é declarar os tipos da mesma função que estão sobrecarregados. O caso típico é o método EventEmitter on () que aceita vários tipos de ouvintes. Semelhante pode acontecer Ao trabalhar com ações redux - e você usa o tipo de ação como literal para marcar a sobrecarga. No caso de EventEmitters, você usa o tipo literal do nome do evento:
fonte