Возможен также случай, когда MyType
может быть string | number
, что extends
StringOrNumber
.Например, add<string | number>('', 1);
- это совершенно правильный вызов функции с определенной вами подписью.Тип, расширяющий тип объединения, не означает «выбрать ровно один».
Поскольку ваша подпись имеет смысл, и вы изучаете дженерики, поэтому мы хотим придерживаться ее, мы также можем отключить проверку типов в этот момент.Иногда машинопись действительно не может понять ваш сложный сценарий, и у вас нет другого выбора, кроме return (x as any) + y
, чтобы отказаться от проверки типов в этой точке.
Другой способ справиться с ситуацией такого типа - перегруженныйподписи, подобные следующей
function add(x: string, y: string): string;
function add(x: number, y: number): number;
function add(x: any, y: any): any {
return x + y;
}
const t1: string = add(10, 1); // Type 'number' is not assignable to type 'string'.
const t2: number = add(10, 1); // OK
const t3: string = add('10', '1'); // OK
const t4: number = add('10', 1); // Argument of type '"10"' is not assignable to parameter of type 'number'.