En TypeScript, puedo declarar un parámetro de una función como un tipo Función. ¿Hay una forma "segura de escribir" de hacer esto que me falta? Por ejemplo, considere esto:
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);
La devolución de llamada de guardar no es de tipo seguro, le estoy dando una función de devolución de llamada donde el parámetro de la función es una cadena pero le estoy pasando un número y se compila sin errores. ¿Puedo hacer que el parámetro de resultado guarde una función de tipo seguro?
TL; Versión DR: ¿hay un equivalente de un delegado .NET en TypeScript?
fuente
(n: number) => any
significa cualquier firma de función?number
) pero el tipo de retorno no está restringido en absoluto (podría ser cualquier valor, o inclusovoid
)n
esta sintaxis? ¿No serían suficientes solo los tipos de entrada y salida?Aquí hay equivalentes de TypeScript de algunos delegados comunes de .NET:
fuente
Action
yFunc
los delegados tanto obviate la mayor parte de la necesidad de tipos específicos de delegados y, curiosamente, dan C # una de apariencia de tipificación estructural. La desventaja de estos delegados es que sus nombres no tienen sentido, pero las otras ventajas generalmente superan esto. En TypeScript simplemente no necesitamos estos tipos. Así sería el antipatrónfunction map<T, U>(xs: T[], f: Func<T, U>)
. Prefierofunction map<T, U>(xs: T[], f: (x: T) => U)
Me doy cuenta de que esta publicación es antigua, pero hay un enfoque más compacto que es ligeramente diferente de lo que se pidió, pero puede ser una alternativa muy útil. Se puede declarar esencialmente la función en línea al llamar al método (
Foo
'ssave()
en este caso). Se vería algo así:El
multipleCallback()
enfoque es muy útil para cosas como llamadas de red que pueden tener éxito o fallar. Una vez más, suponiendo un ejemplo de llamada de red, cuandomultipleCallbacks()
se llama, el comportamiento tanto para el éxito como para el fracaso se puede definir en un solo lugar, lo que se presta a una mayor claridad para futuros lectores de códigos.En general, en mi experiencia, este enfoque se presta a ser más conciso, menos desorden y mayor claridad en general.
¡Buena suerte a todos!
fuente
Esto seguramente se alinea con el paradigma de programación funcional.
fuente
inputType
lugar dereturnType
, ¿no? ¿DóndeinputType
está el tipo deldata
cual pasa un parámetro a lacallback
función?En TS podemos escribir funciones de la siguiente manera:
Tipos de funciones / firmas
Esto se usa para implementaciones reales de funciones / métodos, tiene la siguiente sintaxis:
Ejemplo:
Tipo de función Literales
Los literales de tipo de función son otra forma de declarar el tipo de una función. Por lo general, se aplican en la firma de la función de una función de orden superior. Una función de orden superior es una función que acepta funciones como parámetros o que devuelve una función. Tiene la siguiente sintaxis:
Ejemplo:
fuente
Si define el tipo de función primero, se vería así
Sin el tipo de función utilizando la sintaxis de propiedad simple, sería:
Si lo desea mediante el uso de una función de interfaz como delegados genéricos de C # sería:
fuente
Además de lo que dijo otro, un problema común es declarar los tipos de la misma función que está sobrecargada. El caso típico es el método EventEmitter on () que aceptará múltiples tipos de oyentes. Puede ocurrir algo similar al trabajar con acciones redux, y allí usa el tipo de acción como literal para marcar la sobrecarga. En el caso de EventEmitters, usa el tipo de nombre de evento literal:
fuente