Как сделать универсальный оператор добавления в TypeScript, который работает с числами и строками - PullRequest
0 голосов
/ 01 февраля 2019

Изучая дженерики в TypeScript, я хотел попытаться воссоздать следующий код JavaScript:

function add(x, y){
    return x + y;
}

Я пробовал как:

type StringOrNumber = string | number;

function add<MyType extends StringOrNumber>(x: MyType, y: MyType): MyType {
    return x + y;
}

Это ошибки с:

error TS2365: Operator '+' cannot be applied to types 'MyType' and 'MyType'.

Почему это не работает?Я бы предположил, что MyType может быть либо строкой, либо числом, и как только «выбранный» TypeScript узнает, он либо добавляет две строки , либо два числа.

1 Ответ

0 голосов
/ 01 февраля 2019

Возможен также случай, когда 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'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...