Проблема с функцией generi c - PullRequest
       0

Проблема с функцией generi c

0 голосов
/ 22 февраля 2020

Не знаю, почему у меня появляется сообщение об ошибке

teste.ts: 41: 18 - ошибка TS2345: Аргумент типа 'T' не может быть присвоен параметру типа 'number' .

в следующем коде

function carre1<T>(x: T):T {
    x = Math.pow(x, 2);
    return x;
}
console.log(carre1<number>(0));
console.log(carre1<number>(2));
console.log(carre1<number>(5));

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Я полагаю, что вы пытаетесь изучить дженерики и их использование. Возможно, функция, которой вы только что поделились, на самом деле не является хорошим примером для дженериков. Ожидается, что первый параметр 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. Обратитесь к этому примеру, приведенному здесь { ссылка }

0 голосов
/ 22 февраля 2020

TypeScript знает, что это число:

function carre1<T>(x: T):T {
  // x must be a number because Math.pow only takes a number
    x = Math.pow(x, 2);  
    return x;
}

Обобщения наиболее полезны для специализированных функций, которые принимают объект в качестве параметра.

interface HasXProp {
  x: number
}

function carre1<T extends HasXProp>(something: T): T {
    const x = Math.pow(something.x, 2);  
    return { ...something, x };
}
...