2016-05-26 113 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

相关问题