我有以下逻辑:

interface ResultBase {
    readonly success: boolean
}

type Result<Payload = undefined> = ResultBase & (Payload extends undefined ? {
    readonly payload?: unknown
} : {
    readonly payload: Payload
})

function getResult<Payload = undefined>(payload: Payload): Result<Payload> {
    return {
//  ^^^^^^
        success: true,
        payload,
    }
}

100.

带下划线的标记为return的语句带有编译器错误:

Type '{ success: true; payload: Payload; }' is not assignable to type 'Result<Payload>'.
  Type '{ success: true; payload: Payload; }' is not assignable to type 'Payload extends undefined ? { readonly payload?: unknown; } : { readonly payload: Payload; }'.

我想知道,为什么错误消息中的条件类型不包括success属性?难道它不应该被包括在ResultBase & …中吗?

推荐答案

注意:我不会太多地谈论编译器无法接受您的实现的潜在问题.try 为依赖于generic类型参数的conditional type的类型赋值几乎总是失败的,因为编译器没有理解它们含义所需的高阶推理能力.这超出了所问问题的范围,所以我不再离题了.


一般来说,如果您try 将类型T分配给intersection type X & Y,则它只能判断T是否同时可分配给XY.如果编译器认为T不能赋值给其中至少一个,那么它将报告关于损坏的那个的错误.因此,如果T可赋值给X,而不是Y,那么您可能会收到类似Type 'T' is not assignable to type 'Y'的错误消息.没有必要提到X,因为这不是问题所在.

打个比方:如果你要一个红苹果,而我给了你一个红梨,你可能会反对"但这不是苹果",而不会觉得有必要在你的句子中提到"红".说"但这不是一个红苹果"不是incorrect,但"红"这个词并不是问题的真正根源.

在上面的例子中,T等于{ success: true; payload: Payload; }X等于{ readonly success: boolean }Y等于Payload extends undefined ? { readonly payload?: unknown; } : { readonly payload: Payload; }. 编译器很高兴看到T可以赋值给X.但它无法验证T是否可分配给Y. 所以错误消息并没有提到ResultBase &,因为它与错误没有直接关系.

Typescript相关问答推荐

如何修复VueJS中的val类型不能赋给函数

如何从TypScript中的接口中正确获取特定键类型的所有属性?

APP_INITIALIZER—TypeError:appInits不是函数

类型脚本强制泛型类型安全

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

为什么TypeScript失go 了类型推断,默认为any?''

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

Typescript泛型类型:按其嵌套属性映射记录列表

向NextAuth会话添加除名称、图像和ID之外的更多详细信息

匿名静态类推断组成不正确推断

被推断为原始类型的交集的扩充类型的交集

具有自引用属性的接口

在React中定义props 的不同方式.FunctionalComponent

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

在抽象类构造函数中获取子类型

在TypeScript中,如何通过一系列过滤器缩小类型?

带有';的类型脚本嵌套对象可选属性错误满足';

Route.ts文件中未导出HTTP方法

TypeScript:如何使用泛型和子类型创建泛型默认函数?

如何在TypeScript中声明逆变函数成员?