在打字稿中,如果我有一个工厂方法,根据运行时值可能会产生不同的对象。如何声明所创建对象的结果数组是一种类型还是另一种类型,而不是两者都是?
interface Foo {
fooProp: 'Foo'
}
interface Bar {
barProp: 'Bar'
}
function barFactory(): Bar {
return { barProp: 'Bar' }
}
function fooFactory(): Foo {
return { fooProp: 'Foo' }
}
let factory: (() => Foo) | (() => Bar);
let someRuntimeValue = true;
if (someRuntimeValue) {
factory = fooFactory;
} else {
factory = barFactory;
}
let objects: Foo[] | Bar[];
for (let n = 0; n < 10; ++n) {
//TS - Argument of type 'Foo | Bar' is not assignable
//to parameter of type 'Foo & Bar'.
objects.push(factory());
}
答案 0 :(得分:0)
如果它不是运行时值,则可能可以使用模板(只要您的代码封装在函数,类或接口中),但是由于它是变量,因此必须使用{{ 1}}短语,使编译器在您的代码中“忽略它”,如下所示:
as any
在打字稿中,尤其是在执行此类操作时,必须使用let objects: Foo[] | Bar[];
for (let n = 0; n < 10; ++n) {
objects.push(factory() as any); // ignore the `Foo | Bar` return type
}
短语-只需确保您在正确执行操作即可,因为编译器将会跳过此处的类型检查。
例如,也许以后您想将其传递给仅处理as any
类型的函数;您将不得不在此处使用类似的内容:
Foo[]