默认情况下,如中所述
documentation
,条件类型在
分配的
在联合类型上使用时的方式。
这里有一个简化的例子来证明这一点:
type ApprovalType = "PENDING" | "APPROVED" | "REJECTED";
type Distributed<T> = T extends string ? T[] : never;
type ApprovalTypes = Distributed<ApprovalType>;
// type ApprovalTypes = "PENDING"[] | "APPROVED"[] | "REJECTED"[]
为了避免分布式行为,您可以在条件类型中使用方括号。应用于同一个例子,这将产生:
type ApprovalType = "PENDING" | "APPROVED" | "REJECTED";
type NonDistributed<T> = [T] extends [string] ? T[] : never;
type ApprovalTypes = NonDistributed<ApprovalType>;
// type ApprovalTypes = ("PENDING" | "APPROVED" | "REJECTED")[]
或者,应用于您问题中的代码:
function conditionalTypeFn<T>(props: [T] extends [string] ? B<T> : A<T>) {
return props;
}
Playground link