在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);