2012-10-06 18 views
17

私は、次のコードは、エラーが発生しない理由を理解することはできないように見える:TypeScript:void戻り値の型は任意の型に変換されますか?

var rg: {(): void;}[] = []; 
rg.push(function():string {return "";}) 

私は、明らかに私はそこに返す関数をプッシュし、タイプがvoidを返す関数の配列であることを述べますa ですが、コンパイラは文句を言っていません。 rgの定義を

に変更した場合
var rg: {():number;}[] = []; 

コンパイラが文句を言うようになりました。

これはバグですか、またはvoid戻り値の型がどのように働くのでしょうか(つまりvoidが使用されていて、復帰型anyと基本的に同じになります)。

+0

私は(http://typescript.codeplex.com/workitem/139)[問題を提起]しました:これは許可されていないですのでvoidはまだanyと異なること

注意。 –

答えて

17

これは設計によるものです(これはまもなくデザインが良い理由を説明します)。スペックは、(明確にするため要約セクション3.6.3、に)言う:この場合

A type S is assignable to a type T, and T is assignable from S, if one of the following is true...

  • S and T are object types and, for each member M in T, one of the following is true:

    • M is a call, construct or index signature and S contains a call, construct or index signature N where

      • the result type of M is Void, or the result type of N is assignable to that of M.

() => string() => voidに割り当て可能であるならば、我々はテストしています。だからstringvoidに割り当て可能でなければならず、voidvoidでなければなりません。実際に


は、ここでのルールは、あなたがどのように、例えばと一致している戻り値を、捨てて許可されていですC++はvoidをテンプレートの解像度で扱います。私たちは(widget) => voidをするchangeの種類を制限する場合、あなたはそれが戻り値、しかしまだときに我々のことを確認することがあっても2番目の引数としてdecrementWidgetHeightを渡すことができるように

function decrementWidgetHeight(w: Widget): number { 
    // ... returns the new height of the widget 
} 

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void { 
    // for each widget in the array, apply 'change' to it 
} 

// Later... 
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed? 

、我々はそれを作っていますapplyToManyWidgetsという本文を書くと、誤って戻り値changeはどこにも使用されません。

function f() { } 
var x = f(); // Disallowed, f() is of type 'void' 
+0

+1 - これを使ってテストすることができます: 'var rg:{():void;} [] = []; TypeScriptのプレイグラウンドでrg.push(function():string {return "";})var x = rg [0](); ' 'void'を' string'に変更すると、戻り値を使うことができます。 – Fenton

+0

これは意味がありますが、直感的ではありません。つまり、定義に空白があっても型に一致しない関数を追加することができます。 –

+1

仕様では、「voidはUndefined、Null、Anyのいずれかの型にのみ関連している」と書かれているので、仕様が一貫しているかどうかはわかりません。確かに予期しない。 – Roly

0

これはバグのようです。問題のためにnew work itemを開こうとします。

+0

[それは](https://typescript.codeplex.com/workitem/1734)でしたが、上記のコメントをいただきまして、これは意図していると思います。ジェネリックスを見つけるのが今のところTSで多く使われていない... – Roly

関連する問題