ts// valueが1つでもtrueのものがあればtrue
// prettier-ignore
type Some<T extends Record<string, boolean>>
= true extends IsEmpty<T>
? true // Vacuous Truth
: Not<IsEmpty<Filter<T>>>;
tstype Filter<T extends Record<string, any>> = {
[Key in keyof T as true extends T[Key] ? Key : never]: T[Key];
};
tstype A1 = Some<{ a: true; b: true }>; // true
type A2 = Some<{ a: true; b: false }>; // true
type A3 = Some<{ a: false; b: false }>; // false
ts test('Some', () => {
expectTypeOf<Some<{}>>().toEqualTypeOf<true>();
expectTypeOf<Some<{ a: true; b: true }>>().toEqualTypeOf<true>();
expectTypeOf<Some<{ a: true; b: false }>>().toEqualTypeOf<true>();
expectTypeOf<Some<{ a: false; b: false }>>().toEqualTypeOf<false>();
});