Cómo declarar tipos de retorno para funciones en TypeScript
Revisé aquí https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md , que son las especificaciones del lenguaje TypeScript , pero no pude encontrar cómo puedo declarar un tipo de retorno de la función.
Mostré lo que esperaba en el siguiente código:greet(name:string): string {}
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet(): string {
return "Hello, " + this.greeting;
}
}
Sé que puedo usarlo (name:string) => any
, pero esto se usa principalmente cuando se pasan funciones de devolución de llamada:
function vote(candidate: string, callback: (result: string) => any) {
// ...
}
Tiene razón: aquí hay un ejemplo completamente funcional; verá que var result
es implícitamente una cadena porque el tipo de retorno se especifica en la greet()
función. Cambie el tipo a number
y recibirá advertencias.
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() : string {
return "Hello, " + this.greeting;
}
}
var greeter = new Greeter("Hi");
var result = greeter.greet();
Aquí está el ejemplo de números: verás garabatos rojos en el editor del patio de juegos si intentas esto:
greet() : number {
return "Hello, " + this.greeting;
}
Los tipos de retorno que usan notación de flechas son los mismos que las respuestas anteriores:
const sum = (a: number, b: number) : number => a + b;
functionName() : ReturnType { ... }
Puede leer más sobre los tipos de funciones en la especificación del lenguaje en las secciones 3.5.3.5 y 3.5.5.
El compilador de TypeScript inferirá tipos cuando pueda, y una vez hecho esto, no es necesario especificar tipos explícitos. entonces, para el ejemplo de greeter, greet() devuelve un literal de cadena, que le dice al compilador que el tipo de función es una cadena y que no es necesario especificar un tipo. Entonces, por ejemplo, en este ejemplo, tengo la clase greeter con un método greeter que devuelve una cadena y una variable que se asigna a un número literal. el compilador inferirá ambos tipos y obtendrá un error si intenta asignar una cadena a un número.
class Greeter {
greet() {
return "Hello, "; // type infered to be string
}
}
var x = 0; // type infered to be number
// now if you try to do this, you will get an error for incompatable types
x = new Greeter().greet();
De manera similar, este ejemplo causará un error ya que el compilador, dada la información, no tiene forma de decidir el tipo, y este será un lugar donde deberá tener un tipo de retorno explícito.
function foo(){
if (true)
return "string";
else
return 0;
}
Esto, sin embargo, funcionará:
function foo() : any{
if (true)
return "string";
else
return 0;
}