当条件类型在联合类型中使用时,我遇到了类型推断的问题。
可能有更短的方法来证明这个问题,但我找不到......
在这个操场链接上查看实际问题。
考虑以下Result<T>,一个联合类型,用于指示操作的成功或失败(带有可选的附加值,类型为T)。对于成功案例,我使用了条件类型SuccessResult<T>,它解析为OKResultor ValueResult<T>(取决于结果是否还应该带有附加的value):
type Result<T = undefined> = SuccessResult<T> | ErrorResult;
interface OKResult {
type: 'OK';
}
interface ValueResult<T> {
type: 'OK';
value: T;
}
interface ErrorResult {
type: 'Error';
error: any;
}
type SuccessResult<T = undefined> = T extends undefined ? OKResult : ValueResult<T>;
function isSuccess<T>(result: Result<T>): result is SuccessResult<T> {
return result.type === 'OK';
}
让我们用一个简单的联合类型来使用它:
type C1 = "A1" | "B1";
function makeC1(): C1 { return "A1" }
const c1: C1 = makeC1();
const c1Result: Result<C1> = { type: "OK", value: c1 }; // ALL IS GOOD
现在,让我们使用复杂值的联合类型C1,而不是简单的联合类型,以完全相同的方式:"A1" | "B1"C2
type A2 = {
type: 'A2';
}
type B2 = {
type: 'B2';
}
type C2 = A2 | B2;
function makeC2(): C2 { return { type: "A2" } }
const c2: C2 = makeC2();
const c2Result: Result<C2> = { type: "OK", value: c2 }; // OH DEAR!
这会导致错误:
类型“C2”不可分配给类型“B2”。
类型“A2”不可分配给类型“B2”。
属性“类型”的类型不兼容。
类型“A2”不能分配给类型“B2”。
如果我从等式中删除条件输入并定义我Result<T>使用ValueResult<T>而不是SuccessResult<T>:
type Result<T = undefined> = ValueResult<T> | ErrorResult;
...一切都恢复正常,但我失去了发出毫无价值的成功信号的能力。如果在这种情况下我不能让可选类型工作,这将是一个可悲的后备。
我哪里做错了?我如何SuccessResult<T>在Result<T>联合中使用,T它本身就是一个复杂的联合类型?