2012-10-04 39 views
62

Burada olan http://go.microsoft.com/fwlink/?LinkId=267238 işaretliydi, ancak işlev türünde bir dönüş türünü nasıl bildirebileceğimi göremedim. Nedense bir şeyi (name:string) => any kullanabilirsiniz bkz greet(name:string) :string {}TypeScript'teki İşlevler için İade Türleri nasıl bildirilir

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

ama etrafında geri arama fonksiyonlarını geçerken çoğunlukla kullanılır:: Ben aşağıdaki kodu bekliyordum gösterdi

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

Kodunuz doğru 'selamlıyorum()' fonksiyonu üzerine bir dönüş türü beyan eder. Ne problemin var? –

+1

Bunu biliyordum, bunun doğru olduğunu bilmiyordum. Görmeyi umduğum şeydi ve ne olduğunu görmek için ne olduğunu umuyordum. LOL :) – Tarik

+1

İndirmenin gerekli olduğunu düşünmüyorum! – Tarik

cevap

57

Haklısın - burada Tam olarak çalışan bir örnek - greet() işlevinde dönüş tipi belirtildiğinden, var result öğesinin dolaylı olarak bir dize olduğunu görürsünüz. Türü number olarak değiştirin ve uyarı alırsınız. İşte

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

sayı örneğidir - Bunu denerseniz oyun editörü kırmızı karalamalar görürsünüz:

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

Teşekkürler, umduğum şeyin doğru olduğunu görmek güzel! – Tarik

14

Sen bölümlerde 3.5.3.5 yılında language specification işlevi türleri hakkında daha fazla bilgi edinebilirsiniz ve 3.5.5.

TypeScript derleyicisi, türleri olabildiğinde çıkartacaktır ve bu, açık türleri belirtmenize gerek kalmaz. selamlayıcı örnek için, greet(), derleyiciye, işlev türünün bir dize olduğunu ve bir tür belirtmeye gerek olmadığını söyleyen bir dize değişmezini döndürür. Örneğin bu örnekte, bir dizi döndüren bir karşılama yöntemiyle ve sayı değişmezine atanan bir değişkenle karşılama sınıfına sahibim. Derleyici her iki türü de sorar ve bir sayıya bir dize atamaya çalışırsanız bir hata alırsınız.

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

Benzer şekilde, bu örnek bilgi verilmiş derleyici gibi bir hataya neden olur, türünü karar için bir yol vardır ve bir açık dönüş türü gereken yer bu bir yer olacak.

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

Ancak bu, çalışır:

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

Son paragraf için teşekkürler! – Tarik

+1

Bazı durumlarda, iki farklı türde geri dönüşün olabilir, böylece | tüm olası dönüş türünü bildiren (boru): '' foo işlevi(): string | number {} '' ' – Snook

1
functionName() : ReturnType { ... } 
İlgili konular