Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Typescript中重载时错误解释了类型_Typescript_Overloading - Fatal编程技术网

在Typescript中重载时错误解释了类型

在Typescript中重载时错误解释了类型,typescript,overloading,Typescript,Overloading,考虑下面的类和带有两个实现的factory方法 class SomeClass { public someId: number; public someProp: string; constructor(input) { // do some internal stuff with input; } } function factory(singleInput: {}): SomeClass; function factory(multipleInput: Array&l

考虑下面的类和带有两个实现的
factory
方法

class SomeClass {
  public someId: number;
  public someProp: string;
  constructor(input) {
    // do some internal stuff with input;
  }
}
function factory(singleInput: {}): SomeClass;
function factory(multipleInput: Array<{}>): Array<SomeClass>;
function factory(singleOrMultipleInput: {} | Array<{}>): SomeClass | Array<SomeClass> {
  if (singleOrMultipleInput instanceof Array) {
    // case multiple input: Array<{}>
    const arrayOfSomeClass = singleOrMultipleInput.map(ro => new SomeClass(singleOrMultipleInput)); // indeed is shown as SomeClass[]
    return arrayOfSomeClass;
  } else {
    // case single input: {}
    const singleSomeClass = new SomeClass(singleOrMultipleInput); // indeed is shown as SomeClass
    return singleSomeClass;
  }
}
但是,在factory方法中,
arrayOfSomeClass
singleSomeClass
是正确键入的。为什么解释器将
multipleResult
显示为
SomeClass[]


后续问题:如何实现它以使解释器显示我期望的类型?(最好将工厂方法作为
SomeClass
static
(generic?)方法(我意识到这可能通过避免重载来实现,但这不是我想要的)

我不是100%确定,但似乎检查的实例必须按照与重载相同的顺序进行

function factory(multipleInput: Array<{}>): Array<SomeClass>;
function factory(singleInput: {}): SomeClass;
function factory(singleOrMultipleInput: {} | Array<{}>): SomeClass | Array<SomeClass> 
但这没关系

function acceptsObjectType(obj:{}) {
  return obj;
}

let a:{} = [];
a = acceptsObjectType(a);

天啊…你说得对。这看起来像是一个打字脚本错误。我们再等一会儿,看看是否有人能给出一个正确的解释,如果没有,我会把你的答案标记为正确。我在任何地方都没有看到打字脚本错误…有什么问题吗?在TypeScript 2.9中,我收到一个错误“Type{}不可分配给Type any[]”,但键入any[]是可分配给{}的。因此它不是一个bug。我觉得以什么顺序声明重载并不重要(与我最初的示例相比,您的解决方案)。可能不是bug,但(至少对我来说)它肯定是意外的行为;恐怕它在例如C#中不会有这样的行为。谢谢大家的输入:“[编译器]查看重载列表,然后继续执行第一个重载,尝试使用提供的参数调用函数。如果找到匹配项,它将选择此重载作为正确的重载。因此,通常会将重载从最特定到最不特定进行排序。”
function acceptsObjectType(obj:{}) {
  return obj;
}

let a = [];
a = acceptsObjectType(a);
function acceptsObjectType(obj:{}) {
  return obj;
}

let a:{} = [];
a = acceptsObjectType(a);