Cómo declarar tipos de retorno para funciones en TypeScript

Resuelto Tarik asked hace 11 años • 8 respuestas

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) {
  // ...
}
Tarik avatar Oct 05 '12 04:10 Tarik
Aceptado

Tiene razón: aquí hay un ejemplo completamente funcional; verá que var resultes implícitamente una cadena porque el tipo de retorno se especifica en la greet()función. Cambie el tipo a numbery 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;
}
Fenton avatar Oct 04 '2012 21:10 Fenton

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;
Adverbly avatar Nov 04 '2018 20:11 Adverbly
functionName() : ReturnType { ... }
Luca C. avatar Jan 01 '2018 16:01 Luca C.

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;
}
mohamed hegazy avatar Oct 04 '2012 22:10 mohamed hegazy