gpt4 book ai didi

typescript - 混合联合类型、泛型和条件类型导致意外 "Type is not assignable to type"错误

转载 作者:行者123 更新时间:2023-12-03 17:18:01 25 4
gpt4 key购买 nike

当在联合类型中使用条件类型时,我遇到了类型推断问题。
可能有一种更短的方法来证明这个问题,但我找不到一个......
在此查看实际问题 playground link .
考虑以下 Result<T> ,用于指示操作成功或失败的联合类型(带有可选的附加值,类型为 T )。对于成功案例,我使用了条件类型 SuccessResult<T> , 解析为 OKResultValueResult<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!
这会导致错误:

Type 'C2' is not assignable to type 'B2'.

Type 'A2' is not assignable to type 'B2'.

Types of property 'type' are incompatible.

Type '"A2"' is not assignable to type '"B2"'.


如果我从方程中删除条件类型并定义我的 Result<T>使用 ValueResult<T>而不是 SuccessResult<T> :
type Result<T = undefined> = ValueResult<T> | ErrorResult;
......一切都恢复了,但我失去了发出毫无值(value)的成功信号的能力。如果我无法在这种情况下使用可选类型,这将是一个可悲的回退。
我哪里做错了?我如何使用 SuccessResult<T>Result<T>工会,其中 T本身是一个复杂的联合类型?
Playground link

最佳答案

type Result<T = undefined> = SuccessResult<T> | ErrorResult;需要是type Result<T = undefined> = SuccessResult<T> | ErrorResult | ValueResult<T>;然后它编译。
干杯,迈克

关于typescript - 混合联合类型、泛型和条件类型导致意外 "Type is not assignable to type"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63974272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com