Например, если метод добавляет два аргумента, a и b, где они должны быть одного типа, и этот тип должен быть либо строкой, либо числом.
Попытка 1:
function add(a: string | number, b: string | number) {
return a + b;
}
Это не сработает, потому что типы a и b могут не совпадать; поэтому результирующая ошибка имеет смысл: error TS2365: Operator '+' cannot be applied to types 'string | number' and 'string | number'.
Попытка 2:
function add<T extends string | number>(a: T, b: T) {
return a + b;
}
Это возвращает тот же код ошибки: error TS2365: Operator '+' cannot be applied to types 'T' and 'T'.
Попытка 3:
function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any) {
return a + b;
}
Это (перегрузка функций) работает правильно, но кажется излишним. Есть ли более элегантный способ выразить это?
string|number
. Это приводит к тому, что реализация функции проверяется как<string|number> + <string|number>
. Когда функция перегружена, сигнатура вызова и сигнатура реализации разделены. При вызове указанной выше функции проверяется тип объединенияstring|number
, но реализация функции будет проверена как тип<any> + <any>
. TS может использовать определение типа, чтобы выяснить тип возвращаемого значения в подписи вызова, но не может в случае<string|number> + <string|number>
. 03.09.2015