Проблема с вашей функцией в том, что она не является действительно общей. У вас есть сигнатура универсальной функции (Transformer
), и вы пытаетесь назначить функцию, которая не является универсальной.
Проблема возникает с типом возвращаемого значения, в частности, потому что вызывающий должен указать тип возвращаемого значения, поэтому вызывающий будет ожидать, что указанный им тип возвращаемого значения не будет вашим неуниверсальным результатом ({ data: Result[] }
). Если ваше назначение было разрешено, этот вызов вызовет ошибку времени выполнения:
let result = transform<Result[], { other: number }>([]);
result.other // this would cause an error
Если тип результата фиксирован, вы должны просто объявить его, а сама реализация функции должна быть универсальной:
export type Transformer = <T extends { extraStuff: any }>(
data: T[],
) => { data: T[] };
class Result {
extraStuff: any;
}
export const transform: Transformer = <T extends { extraStuff: any }>(data: T[]): { data: T[] } => {
if (!data) {
return { data: [] };
}
data.forEach((record: T) => {
record.extraStuff = {
foo: 'bar'
};
});
return { data: data };
};
Или вы можете переместить обобщенные значения Transfomer
из сигнатуры функции в тип и указать аргументы типа при объявлении функции transform
, поэтому сами функции не должны быть универсальными:
export type Transformer<T extends { extraStuff: any }, U> = (
data: T[],
) => U;
export const transform: Transformer<Result, { data: Result[] }> = (data: Result[]): { data: Result[] } => {
if (!data) {
return { data: [] };
}
data.forEach((record: T) => {
record.extraStuff = {
foo: 'bar'
};
});
return { data: data };
};