2012-10-04 14 views
62

Ho controllato qui http://go.microsoft.com/fwlink/?LinkId=267238 che è il TypeScript Language Specifications ma non ho potuto vedere una cosa che come posso dichiarare un tipo di ritorno della funzione. Ho mostrato quello che mi aspettavo nel seguente codice: greet(name:string) :string {}Come dichiarare i tipi di reso per le funzioni in TypeScript

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

vedo che possiamo usare qualcosa (name:string) => any ma sono utilizzati per lo più quando si passa le funzioni di callback in giro:

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

Il codice dichiara correttamente un tipo di ritorno sulla vostra funzione 'salutare()'. Che problema stai avendo? –

+1

Stavo avendo che non sapevo che era corretto. Era quello che mi aspettavo di vedere e quello che speravo di vedere fosse corretto. LOL :) – Tarik

+1

Non penso che il downvote fosse necessario! – Tarik

risposta

57

Lei ha ragione - qui è un esempio pienamente funzionante: vedrete che var result è implicitamente una stringa perché il tipo di ritorno è specificato nella funzione greet(). Cambia il tipo in number e riceverai avvertimenti.

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(); 

Ecco l'esempio numero - vedrete ghirigori rossi nel parco giochi l'editor se provate questo:

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

Grazie, è bello vedere che quello che speravo fosse corretto! – Tarik

14

Si può leggere di più su tipi di funzione nel language specification nelle sezioni 3.5.3.5 e 3.5.5.

Il compilatore TypeScript dedurrà i tipi quando possibile e, a tal fine, non è necessario specificare tipi espliciti. così per l'esempio di benvenuto, greet() restituisce una stringa letterale, che indica al compilatore che il tipo della funzione è una stringa e non è necessario specificare un tipo. per esempio in questo esempio, ho la classe greeter con un metodo greet che restituisce una stringa e una variabile che è assegnata al numero letterale. il compilatore dedurrà entrambi i tipi e si otterrà un errore se si tenta di assegnare una stringa a un numero.

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(); 

Allo stesso modo, questo campione causerà un errore come il compilatore, date le informazioni, non ha modo di decidere il tipo, e questo sarà un luogo dove si deve avere un tipo di ritorno esplicito.

function foo(){ 
    if (true) 
     return "string"; 
    else 
     return 0; 
} 

Questo, tuttavia, funzionerà:

function foo() : any{ 
    if (true) 
     return "string"; 
    else 
     return 0; 
} 
+2

Grazie per l'ultimo paragrafo! – Tarik

+1

In alcuni casi, è possibile che vengano restituiti due tipi diversi in modo da poter utilizzare | (pipe) per dichiarare tutto il possibile tipo di ritorno: '' 'function foo(): string | number {}' '' – Snook

1
functionName() : ReturnType { ... } 
Problemi correlati