【发布时间】:2018-03-25 10:30:51
【问题描述】:
考虑以下类和具有两个实现的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 时,我希望它返回SomeClass 的实例。当使用对象数组[{}, {}, {}] 调用factory 时,我希望它返回SomeClass 的实例数组,例如[SomeClass, SomeClass, SomeClass]。
下面的 sn-p 表明 TypeScript 解释不识别它。
const singleInput: {} = {};
const multipleInput: Array<{}> = [{}, {}, {}];
let singleResult = factory({}); // is SomeClass, as expected
const multipleResult = factory([{}]); // no longer is SomeClass[] ?!
singleResult.someId = 123;
multipleResult.someId = 456; // the interpreter should flag this as wrong
singleResult = multipleResult; // also shouldn't be possible without an warning from the interpreter
但是,在工厂方法中,arrayOfSomeClass 和 singleSomeClass 输入正确。为什么multipleResult 不会被解释器显示为SomeClass[]?
后续问题:如何实现以使解释器显示我所期望的类型? (最好将工厂方法作为SomeClass 的static(通用?)方法(我意识到这可能可以通过避免重载来实现,但这不是我想要的)
【问题讨论】: