2016-05-26 108 views
1

我在打字稿這個非常簡單的代碼:Typescript:爲什麼Array <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]; 
     } 
    } 
} 

在具體的類,當我分配到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 

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 
     } 
    } 
} 

在沒有類型註釋的你在下面的情況:

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; 

即推斷回報類型與所需3tupple類型不兼容。

+0

是的,謝謝!必須明確地聲明這特別奇怪。我想知道是否有任何具體原因。不過謝謝! – naiveai

+1

在沒有註釋的情況下,必須推斷返回。不幸的是,它是根據函數的主體(而不是基類)推斷的,因此你會得到未來的錯誤。 – basarat

+0

哦。這應該被認爲是一個錯誤?我應該提交問題嗎? – naiveai

相關問題