这会导致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;
}
我希望能够在条件中同时初始化和缩小类型。但是,如果我不使用联合类型,则缩小类型将不起作用。
答案 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;
}