Я полагаю, что вы пытаетесь изучить дженерики и их использование. Возможно, функция, которой вы только что поделились, на самом деле не является хорошим примером для дженериков. Ожидается, что первый параметр Math.pow будет числовым типом , поэтому вы получаете сообщение об ошибке. Представьте, что вы вызываете функцию следующим образом:
console.log(carre1<string>("abc"));
Это вызовет ошибку во время выполнения, поэтому в первую очередь она была предотвращена процессом переноса TS.
Если мы посмотрим на функцию с точки зрения функциональности, то вообще не нужно, чтобы она была обобщенной c. Понятно, что это уже число. Затем функцию можно записать как что-то вроде следующего без обобщений:
function carre1(x: number): number {
x = Math.pow(x, 2);
.... some other logics?
return result;
}
Однако, если мы настаиваем на использовании параметра generi c, возможно, можно рассмотреть следующее. Хотя дженерики в этом случае бесполезны:
function carre1<T>(x: T ): T {
let y:any = Math.pow(x as any, 2);
return y;
}
Рассмотрим следующую функцию. Это может быть полезным примером Generics, так как функция должна иметь возможность принимать параметры любого типа. Другими словами, функция logi c не зависит от типа.
function deepCopy<T>(data: T): T {
return JSON.parse(JSON.stringify(data));
}
Другим хорошим примером использования обобщений может быть реализация Data или Object Mapper. Обратитесь к этому примеру, приведенному здесь { ссылка }