打字稿标记联盟类型

时间:2017-05-25 20:35:15

标签: typescript discriminated-union

我想根据我的函数接收的界面区分一些逻辑。为此,我试图使用标记的联合类型,例如,

someFunction(arg: TypeA | TypeB): void {
    if (arg.kind === "TypeA")
    {
        // do this
    }
    else
    {
        // do that
    }
}

,其中

interface TypeA {
    kind: "TypeA";
    propertyA: string;
}

interface TypeB {
    kind: "TypeB";
    propertyB: string;
}

但如果我想调用这个函数,那么如果我没有提供类型的值,那么Typescript会抱怨,即

let typeA: TypeA;
typeA = {propertyA: ""}
someFunction(typeA);

TS2322: Type '{ propertyA: string; }' is not assignable to type 'TypeA'.
  Property 'kind' is missing in type '{ propertyA: string; }'.

因此,如果我每次想要区分时必须实现标记(上例中的kind),我都不明白标记类型是如何工作的。我只能假设我使用它们错了?

1 个答案:

答案 0 :(得分:3)

您可以定义类型保护来执行此操作。它们允许您通过其中一个属性的值或存在来判断参数的类型。

function isTypeA(arg: TypeA | TypeB): arg is TypeA {
    return (<TypeA>arg).propertyA !== undefined;
}

function someFunction(arg: TypeA | TypeB): void {
    if (isTypeA(arg))
    {
      arg.propertyA;
    }
    else
    {
        arg.propertyB
    }
}

您可以阅读有关here的更多信息,并查看一个有效的示例here