2012-10-04 41 views
62

He marcado aquí http://go.microsoft.com/fwlink/?LinkId=267238 que es el pero no pude ver una cosa de la forma en que puedo declarar un tipo de devolución de la función. Le mostré lo que estaba esperando en el siguiente código: greet(name:string) :string {}Cómo declarar los tipos de devolución para las funciones en TypeScript

class Greeter { 
    greeting: string; 
    constructor (message: string) { 
     this.greeting = message; 
    } 
    greet() : string{ 
     return "Hello, " + this.greeting; 
    } 
} 

veo que podemos usar algo (name:string) => any pero se utilizan sobre todo cuando se pasa funciones de devolución de llamada en torno a:

function vote(candidate: string, callback: (result: string) => any) { 
// ... 
} 
+0

Su código declara correctamente un tipo de retorno de la función 'saludar()'. ¿Qué problema estás teniendo? –

+1

Estaba teniendo que no sabía que era correcto. Era lo que esperaba ver y lo que esperaba que fuera correcto. LOL :) – Tarik

+1

¡No creo que el voto fuera necesario! – Tarik

Respuesta

57

Estás en lo correcto - aquí es un ejemplo totalmente funcional: verá que var result es implícitamente una cadena porque el tipo de devolución se especifica en la función greet(). Cambie el tipo a number y obtendrá 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 número - verá garabatos rojos en el editor de juegos infantiles si se intenta esto:

greet() : number { 
    return "Hello, " + this.greeting; 
} 
+0

¡Gracias, es bueno ver que lo que esperaba era correcto! – Tarik

14

Usted puede leer más acerca de los tipos de función en el language specification en las secciones 3.5.3.5 y 3.5.5.

El compilador de TypeScript deducirá los tipos cuando sea posible, y esto se hace, no es necesario especificar tipos explícitos. por lo tanto, para el ejemplo de bienvenida, greet() devuelve un literal de cadena, que le dice al compilador que el tipo de la función es una cadena, y no es necesario especificar un tipo. así que por ejemplo en esta muestra, tengo la clase de bienvenida con un método de saludo que devuelve una cadena, y una variable que está asignada al 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(); 

Del mismo modo, esta muestra se producirá un error como el compilador, dada la información, no tiene manera de decidir el tipo, y esto va a ser un lugar donde usted tiene que tener un tipo de rendimiento 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; 
} 
+2

¡Gracias por el último párrafo! – Tarik

+1

En algún caso, es posible que tenga dos tipos diferentes devueltos para que pueda usar | (pipe) para declarar todo el posible tipo de retorno: '' 'function foo(): string | number {}' '' – Snook

1
functionName() : ReturnType { ... } 
Cuestiones relacionadas