当一个类型在混合数组中包含特定类型时进行推断



我正在尝试创建一个泛型类型,该类型允许推断特定类型何时实现特定类型的混合数组。

const one = 'one' as const;
const two = 'two' as const;
const three = 'three' as const;
type Foo = {
id: number;
refs: Array<{
identity: typeof one;
}>;
};
type Bar = {
id: number;
refs: Array<
| {
identity: typeof one;
}
| {
identity: typeof two;
}
| {
identity: typeof three;
}
>;
};
type Baz = {
id: number;
};
type Entities = Foo | Bar | Baz;
type HasRefs<T> = T extends { refs: any[] } ? T : never;
type ImplementsThree<E extends { refs: any[] }> = E['refs'] extends (infer U)[]
? U extends { identity: typeof three }
? E
: never
: never;
const Bar: ImplementsThree<HasRefs<Entities>>; // Expected Bar. Instead type is Foo | Bar

为方便起见a:TypeScript游乐场

您需要将嵌套的条件类型提取为泛型类型:

type IdentityRefsCommon = { refs: any[] };
type EntityWithIdentity<E extends IdentityRefsCommon, I> = I extends E['refs'][number] ? E : never;
type ImplementsThree<E extends IdentityRefsCommon> = E extends any ? EntityWithIdentity<E, { identity: typeof three }> : never;

const Bar: ImplementsThree<HasRefs<Entities>> = {
id: 1,
refs: [{
identity: "one",
}, {
identity: "two",
}, {
identity: "three",
}]
} // Now it only Bar

最新更新