2015-09-03 22 views
2

只是爲了娛樂,我試圖用TypeScript在包含閉包的代碼中強類型。這裏是原來的JavaScript代碼的樣子:在TypeScript中編碼閉包

var func = (function() { 

    var private_count = 0; 

    var increment = function() { 
    private_count += 1; 
    return private_count; 
    } 

    return increment; 
}()); 

下面是與打字稿實現這個我最好的嘗試:

var func:()=>()=>number = (function():()=>number { 

    var _count: number = 0; 

    var increment:()=>number = function(): number { 
    _count += 1; 
    return _count; 
    } 

    return increment; 
}()); 

FUNC是返回,返回一個數的函數的函數。我將它的類型設置爲'()=>()=>數字',但編譯器不喜歡這樣。我知道這不是TypeScript最實際的用法,但是沒有人有解決編譯錯誤的想法嗎?

回答

6

您可以按原樣保留代碼。 TypeScript已經通過查看初始分配來了解代碼中所有變量的類型。將鼠標懸停在變量上,您將看到它的類型。

代碼中的主要問題是func的類型不正確。這:

var func:() =>() => number = ... 

...應該是這樣的:

var func:() => number = ... 

注意沒有必要的額外() =>,因爲它不是一個返回返回一個數字功能的功能。這只是一個返回數字的函數。


順便說一句,如果你真的想要明確地輸入的一切,這裏是另一種解決方案:

var func:() => number = (() => { 

    var private_count: number = 0; 

    var increment:() => number =() => { 
     private_count += 1; 
     return private_count; 
    }; 

    return increment; 
})(); 

但我只想使用隱式類型的建議(只要他們不是隱any類型),但是這只是一個個人喜好:

var func = (() => { 

    var private_count = 0; 

    var increment =() => { 
     private_count += 1; 
     return private_count; 
    }; 

    return increment; 
})(); 
0

這就是:

var func = (():() => number => { 

    var _count: number = 0; 

    var increment:() => number = function(): number { 

     _count += 1; 

     return _count; 
    } 

    return increment; 
})(); 

但添加接口使其更容易。

interface Increment { 
    (): number; 
} 

var func = ((): Increment => { 

    var _count: number = 0; 

    var increment: Increment = function() { 

     _count += 1; 

     return _count; 
    } 

    return increment; 
})();