[英]cannot satisfy return type for typescript typed function
说我有这种类型:
export type Transformer = <T extends any[], U>(
data: T,
) => U;
然后,我具有要符合此类型的此功能:
export const transform: Transformer = (
data: Result[]
): { data:Result[] } => {
if (!data) {
return { data: [] };
}
data.forEach((record:Result) => {
record.extraStuff = {
foo: 'bar'
};
});
return { data: data };
};
编译器抱怨:
Type '(data: Result[]) => { data: RecordMatchingSearchResult[]; }' is not assignable to type 'Transformer'.
Type '{ data: Result[]; }' is not assignable to type 'U'.
我是否需要向U添加通用约束以使其推断出来。
我也没有写这个类型,但是它不接受泛型参数,而是存在于函数中,这似乎有点奇怪。
函数的问题在于它不是真正的泛型。 您具有通用函数签名( 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 };
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.