将工厂创建的对象推送到数组时,更正类型声明

时间:2019-09-06 01:34:33

标签: typescript

在打字稿中,如果我有一个工厂方法,根据运行时值可能会产生不同的对象。如何声明所创建对象的结果数组是一种类型还是另一种类型,而不是两者都是?

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()); 
}

1 个答案:

答案 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[]