2016-05-26 8 views
1

私は活字体で、この非常に単純なコードを持っている:私は[4, 2, 2]someThingを割り当てるときに、具体的なクラスでTypescript:なぜ配列<number>は[number、number、number]と同じですか?

type SomeType = [number, number, number]; // Should be an array of exactly 3 numbers 

interface IThing { 
    someThing: SomeType 
} 

abstract class SomeClass { 
    abstract getThing(): IThing; 
} 

class ConcreteClass extends SomeClass { 
    getThing() { 
     return { 
      someThing: [4, 2, 2]; 
     } 
    } 
} 

を、活字体は、そのType number[] is not assignable to type [number, number, number]を文句を言います。これはなぜですか、それ以外の方法でsomeThingが3つの数字だけの配列であることを保証できますか?

答えて

1

あなたはそれが正常に動作し、戻りの型注釈に置く場合:推測されるリターンすなわち

type SomeType = [number, number, number]; // Should be an array of exactly 3 numbers 

let x: SomeType; 
// Okay 
x = [1,2,3]; 
// Not okay 
let y = [1,2,3]; // inferred `number[]` 
x = y; 

:あなたは次のような場合にはある型注釈が存在しない場合には

type SomeType = [number, number, number]; // Should be an array of exactly 3 numbers 

interface IThing { 
    someThing: SomeType 
} 

abstract class SomeClass { 
    abstract getThing(): IThing; 
} 

class ConcreteClass extends SomeClass { 
    getThing(): IThing { // annotation here 
     return { 
      someThing: [4, 2, 2] // no error here 
     } 
    } 
} 

タイプは希望の3タップタイプと互換性がありません。

+0

はい、ありがとうございます!これを明示的に宣言しなければならないのは特に奇妙です。何か特別な理由があるのだろうかと思います。とにかくおかげで! – naiveai

+1

注釈がない場合、リターンを推定する必要があります。残念ながら、関数の本体(基本クラスではない)に基づいて推論されるため、将来のエラーが発生します。 – basarat

+0

ああ。これはバグと見なされるべきですか?問題を提出する必要がありますか? – naiveai

関連する問題