2016-08-01 7 views
0

みましょう、我々はこのコードを持っていると言う:互換性のあるタイプ

class MyEvent { 
    timestamp:number; 
} 
class AEvent extends MyEvent{ 
    x:number; 
    y:number; 
} 
class BEvent extends MyEvent{ 
    key:string; 
} 
var fn:(event:MyEvent)=>void; 
function AE(event:AEvent){ 
    let x = event.x; //Ok, but BEvent hasn't 'x' property. 
} 
fn = AE; 
fn(new BEvent()); 

活字体がエラーについて通知しません。 typescriptの場合は有効なコードです。 私はそれを試写会場で試しました。 (1.8版)

どうやって禁止するためにタイスクリプトを強制するのですか?

例えば、C++で

class Base { 
    public: 
     int timestamp; 
}; 

class B: public Base { 
    public: 
     char key; 
}; 
class A: public Base { 
    public: 
     int x; 
     int y; 
}; 


void fA(A *ptr) {} 

void (*fn)(Base *ptr); 


int main() 
{ 
    A *a = new A(); 
    B *b = new B(); 

    fn = fA; //error: invalid conversion from 'void (*)(A*)' to 'void (*)(Base*)' 
    fn(b); 
} 

答えて

2

関数パラメータは、いくつかのランタイムエラーは、いくつかのまれな場合に発生する可能性があっても、共通のJavaScriptパターンを可能にする二変です。タイプcompatibility handbookによれば

は:いずれかのソースパラメータが目標パラメータ、 又はその逆に割り当て可能である場合

関数パラメータのタイプを比較し、割り当ては を成功します。もっと特殊な型を取るが、それほど特殊化されていない型の 関数を呼び出す関数があれば、呼び出し元は になるかもしれないので、これは悪いことです。実際には、この種のエラー はまれであり、これにより多くの一般的なJavaScriptパターンが可能になります。要約するWhy are function parameters bivariant?

、活字体型システムにおいて、 より具体的な型受容機能はあまり特異的タイプが提供受け入れる 機能に割り当て可能でなければならないかどうかの疑問より具体的な型の配列がより具体的でない型の配列 に割り当て可能であるべきかどうかに関する前提条件の答え 後者のケースが でないことは、大多数のケースで許容されるタイプのシステムではなく、 なので、 関数の引数型の特定のケースについて正確性のトレードオフを取らなければなりません。

+0

私は、私のケースは「いくつかのまれなケースで実行時エラーが発生する可能性がある」と結論付けました。 – Oleg

関連する問題