我有以下逻辑:
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,
}
}
尝试一下。
标记的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 & …
?
注意:我不会过多讨论编译器无法接受您的实现的根本问题。尝试将值分配给涉及依赖于泛型类型参数的条件类型的类型几乎总是会失败,因为编译器不具备理解它们的含义所需的高阶推理能力。这超出了所提出问题的范围,所以我不会进一步离题。
一般来说,如果您尝试将类型分配
T
给交集类型X & Y
,则只能类型检查是否T
可分配给X
和Y
。如果编译器认为它至少不能T
分配给其中之一,那么它将报告有关损坏的错误。因此,如果T
可以分配给X
但不能分配Y
,那么您可能会收到类似 的错误消息Type 'T' is not assignable to type 'Y'
。无需提及,X
因为这不是问题。打个比方:如果你要一个红苹果,而我给你一个红梨,你可能会用“但这不是苹果”来反对,而不觉得需要在句子中提及“红”。说“但这不是红苹果”并没有什么不正确,但“红”这个词并不是问题的真正根源。
在上面的示例中,
T
is{ success: true; payload: Payload; }
、X
相当于{ readonly success: boolean }
、Y
相当于Payload extends undefined ? { readonly payload?: unknown; } : { readonly payload: Payload; }
。编译器很高兴看到它T
可以分配给X
. 但它无法验证是否T
可分配给Y
. 因此错误消息没有说明任何有关 的信息ResultBase &
,因为它与错误没有直接关系。