在打字稿中初始化联合类型

时间:2018-07-17 10:45:38

标签: typescript

这会导致asd和sdf函数出现错误,表明变量o的类型与初始化不兼容:

enum E {
    a,b,c,d
}

type Xe = E.a | E.b;
type Ye = E.c | E.d;

interface X {
    f: Xe;
}

interface Y {
    f: Ye;
}

type I = X | Y;

function asd(v: E) {
    // Error
    const o: I = {
        f: v,
    };
}

function sdf(o: I) {
    if (o.f == E.a) {
        // type of o should be narrowed down to X
    }
}

错误是:

Type '{ f: E; }' is not assignable to type 'I'.
  Type '{ f: E; }' is not assignable to type 'Y'.
    Types of property 'f' are incompatible.
      Type 'E' is not assignable to type 'Ye'.

由于某种原因,类型I不等同于此接口:

interface I {
    f: Xe | Ye;
}

我希望能够在条件中同时初始化和缩小类型。但是,如果我不使用联合类型,则缩小类型将不起作用。

1 个答案:

答案 0 :(得分:0)

您可以添加一个合并类型,为内部字段创建联合类型:

type Merge<This, Other> = {
    [T in Extract<keyof This, keyof Other>]: This[T] | Other[T];
}

这将获取两个接口(Extract<keyof This, keyof Other>)上的所有键,并为其创建一个联合类型。

type I = Merge<X, Y>;

将等同于:

type I = {
    f: Xe | Ye;
}