// 5.4.2
// TODO: убрать повторения, отсортировать, взять первый вариант
type N = string & { __g: never };
type P = {
    'link': number[];
    'type': Array;
    'flag': Array<[]>;
    'match': string[];
    'interface': Array;
    'extend': N;
}
type Q = T extends `${infer H}_${infer B}` ? (B extends N ? Q<`${T}_${T}`> : `${B}_${H}_${B}`) : Q<`${T}_${T}`>;
type O = T extends Array ? null : T extends N ? null : T;
type B = NonNullable]>>;
type L = {[P in keyof T as T[P] extends Value | undefined ? P : never]: T[P]};
type A = `${keyof L}s`;
type Alphabet = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
type Keep = T extends `${infer L}` ? (L extends 'w' | 'a' | 't' | 'j' ? L : 'a') : 'c';
type S = Keep;
type F = `${T}${T}${T}${T}`;
type Result = `{flag_${Q}_${F}}`;

// TODO: вспомнить подходящее значение
const result: Result = "{flag_}"