繁体   English   中英

无法满足Typescript类型函数的返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM