2013-02-11 9 views
35

Neden Typescript, tanımladığım işlevin, arabirim bildirimi ile eşleşmediği konusunda uyarmıyor, ancak işlevi çağırmaya çalıştığımda beni uyarıyor. data ve toUpper -Typescript İşlev Arabirimi

interface IFormatter { 
    (data: string, toUpper : boolean): string; 
}; 

//Compiler does not flag error here. 
var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

upperCaseFormatter("test"); //but does flag an error here. 

cevap

53

arayüzü arabirimini uygulamak fonksiyonların tüm Arayanların gerekli argümanları tedarik sağlar.

TypeScript, kullanılmayan argümanları iletirseniz JavaScript'in işe yaramadığını anladığından, bu uygulamalarda akıllıca izin verir.

Bu neden sorun değil? Çünkü, aramanın herhangi bir uygulamasını çağrı kodunu etkilemeden değiştirebilirsin.

Örnek: IFormatter uygulamasının yerini alabilir ve kod çalışır. Kod az okunabilir hale getirir - typescript bunu yapmadı Eğer

interface IFormatter { 
    (data: string, toUpper : bool): string; 
}; 

var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) { 
    if (toUpper) { 
     return data.toUpperCase(); 
    } 

    return data.toLowerCase(); 
} 

// Switch between these at will 
//var formatter = upperCaseFormatter; 
var formatter = variableCaseFormatter; 

formatter("test", true); 

, sizin upperCaseFormatter fonksiyonunda herhangi bir yerinde kullanılmamıştır toUpper adında bir parametreyi olması gerekir.

+0

Fakat sonra 'upperCaseFormatter' işlevinin gereksiz bir boole değeri vardır:' upperCaseFormatter ("test", true); // 'true' dışında bir derleyici uyarısıyla sonuçlanır. Bunun yerine arabirim yanlıştır ve şöyle olmalıdır: 'interface IFormatter {(data: string, toUpper?: Bool): string; } 'Ancak bu,' variableCaseFormatter' işlevini '' variCaseFormatter ('test') ile '' toUpper '' i belirtmeden, işlev imzasında olmasına rağmen çağırmanız anlamına gelir. Şu anki karışıklığımın daha basit bir örneği için buradaki soruma bakın: http://stackoverflow.com/questions/23305020 – AJP

+5

@AJP Eğer temiz kod yazıyorsanız, hiçbir zaman değişken bir durum biçimlendirici yazmazsınız. Üst ve bir alt için bir sınıf yazıp, kötü boole argümanını tamamen önlersiniz. – Fenton

+0

@AJP Eğer 'upperCaseFormatter' dediğiniz durumda doğrudan arabirim alakasız. –