Well, first you want to constrain your generics to things you actually intend to use with the + operator; presumably string or number. Then, this will still fail, because the compiler will balk at adding string | number. Worse, constraining a generic parameter to extend string | number will cause the compiler to interpret the input as a either a string literal or a numeric literal type, and you do not want the return type of Add(1, 2) to be 1 | 2.
The easiest workaround is to use a type assertion and a conditional type for the return, which widens the result to either string, number, or string | number:
const Add = <T extends string | number>(
arg0: T, arg1: T
): T extends string ? string : number => arg0 as any + arg1;
const A = Add(1, 2); // number
const B = Add('1', '2') // string
Add(1, "2"); // compile error
Add("1", 2); // compile error
const C = Add(Math.random() < 0.5 ? 1 : "1", Math.random() < 0.5 ? 2 : "2"); // string | number
Okay, hope that helps; good luck!
Playground link to code