2016-10-16 7 views
0

これはここに投稿する必要がありますが、これは私が着陸した場所です...これはバグですか?または機能ですか?わからない

コメントのエラーメッセージは次のように表示されます。なぜこれらのエラーが表示されますか?特別にエラー#1、それは安全でキャストする必要がありますので、TがたITestを拡張するために...

interface ITest { 
    answer?: number; // error #1 dissapears if '?' is removed 
} 

class Base<T> { 
    obj: T; 
} 

class Derived<T extends ITest> extends Base<T> { 
    constructor() { 
     super(); 

     var obj = { answer: 42 }; 

     // ok ... no suprise here 
     var test:ITest = obj as ITest; 

     // #1 Neither type { answer: number } or type T is assignable to each other. 
     var t:T = obj as T; 

     // this works ... (why? - specially when 1. dont...) 
     var t2:T = obj as ITest as T; 

     // #2 Type { answer: number } is not assignable to type 'T'. 
     // #3 Cannot convert type { answer: number } to type T. Type parameter T is incompatible with { answer: number }, with is not type parameter. 
     this.obj = obj; 

     // #4 Type ITest is not assignable to type 'T'. 
     // #5 Cannot convert type ITest to type T. Type parameter T is incompatible with ITest, with is not type parameter. 
     this.obj = test; 

     // this works 
     this.obj = obj as any; 

     // in this case error is not shown even if 'answer' is required in ITest ... 
     // (expected: 'Type { totally: string } is not assignable to type 'T'.) 
     this.obj = { totally: 'different' } as any; 
    } 
} 

歓声

答えて

0

これらのエラーの全てが、二つの問題から来るが、我々はそれらに到達する前に、あなたがする必要があると思われますtypescriptですが、種類を比較し、それがusing duck typingmore on duck typing)だ方法を理解する:活字体のコア原則の

一つは、型チェックは値が持っている 形状に焦点を当てていることです。これは、「ダックタイピング」または 「構造的サブタイプ」あなたのコードで

と呼ばれます。この操作を行います。ここでは

var obj = { answer: 42 }; 

objITest、その型が{ answer: number }で、ではありません可能であればコンパイラはそれをITestに一致させますが、objITestではありません。
あなたはそれがITestあなたがする必要があるようにしたい場合:

var obj = { answer: 42 } as ITest; 

それとも

var obj: ITest = { answer: 42 }; 

あなたがITestするobjを定義した場合、エラー#1がなくなっている(またはオプションのプロパティなし)また、ここでエラーが発生しない理由は次のとおりです。

var t2: T = obj as ITest as T; 

その他のエラーは、そのTITestではありません。例えば
は私が持っている場合:

interface ITest2 extends ITest { 
    question: string; 
} 

let c = new Derived<ITest2>(); 

をそれから、今、この:

var obj: ITest = { answer: 42 }; 
... 
this.obj = obj; 

に問題がある、objはタイプITestのですが、タイプITest2であることが必要であるthis.objとして。

あなたは何をやっている知っていることを信頼するようにコンパイラに指示することができます

this.obj = obj as T; 
this.obj = test as T; 

your code with no error in playground

あなたはanyにキャストすると、あなたは基本的にチェックを入力しないようにコンパイラに指示、そのため、あなたはエラーが発生しません:

this.obj = { totally: 'different' } as any; 
関連する問題