// These parentheses should be kept
type t0<T> = (T extends string[] ? T : never)[];
type t1<T> = (T extends string[] ? T : never)[0];
type t2<T> = [(T extends string[] ? T : never)?];
type t3<T> = (T extends string[] ? T : never) | boolean;
type t4<T> = (T extends string[] ? T : never) & boolean;
type t5<T> = keyof (T extends string[] ? T : never);
type t6<T> = T extends Array<infer K extends (T extends string ? string : never)> ? K : never;
type t7<T> = (T extends string[] ? T : never) extends string[] ? T : never;
type t8<T> = T extends (T extends string[] ? T : never) ? string[] : never;
type t9<T> = Promise<T> | (T extends any ? Promise<T> : never);

// These parentheses should be stripped
type s0<T> = [...T extends string[] ? T : never];
type s1<T> = ""[T extends string[] ? "toString" : "valueOf"];
type s2<T> = T extends string[] ? T extends string[] ? T : never : never;
type s3<T> = T extends string[] ? never : T extends string[] ? T : never;