我试图让getResults函数返回正确的类型,但目前仍有以下问题:

interface IResponse<T> {
    result: T;
}

type FnType<P, R> = (params: P) => R;

const r1: IResponse<string[]> = { result: ['123'] };
const r2: IResponse<number[]> = { result: [456] };

const getResults = <T, R extends IResponse<T[]>, P>(fn: FnType<P, R>, params: P): T[] => {
    return [
        ...fn(params).result,
        ...fn(params).result
    ];
};

const getValue = <T>(r: IResponse<T>) => r;

// returned type is unknown[]
// how can we make it return string[]?
getResults(getValue, r1);

// returned type is unknown[]
// how can we make it return number[]?
getResults(getValue, r2);

Playground

代码只是一个示例,在production getResults中,函数用于合并分页请求的结果(本例中fn是一个请求函数)

推荐答案

所以,我不确定这是否也能涵盖生产所需的东西.但是返回类型看起来是这样的:

interface IResponse<T> {
    result: T;
}

type FnType<P, R> = (params: P) => R;

const r1: IResponse<string[]> = { result: ['123'] };
const r2: IResponse<number[]> = { result: [456] };

const myResults = <P,R>(fn: FnType<P,IResponse<R[]>>, params: P): R[] => {
     return [
        ...fn(params).result,
        ...fn(params).result
    ];
}

const getValue = <T>(r: IResponse<T>) => r;

myResults(getValue, r1);

myResults(getValue, r2);

Playground link

编辑:

但我能看到的是,你使用了三种通用类型TRP.我的 idea 是,基本上你只需要担心两种类型,即参数和方法的结果.

我基本上说,getValue's IResponse中的任何类型都将是myResults函数的最终输出.

Typescript相关问答推荐

具有动态键的泛型类型

状态更新后未触发特定元素的Reaction CSS转换

具有泛型类型和缺省值的键

Angular NgModel不更新Typescript

TypeScrip:来自先前参数的参数中的计算(computed)属性名称

ApexCharts条形图未显示最小值.负值

是否将自动导入样式从`~/目录/文件`改为`@/目录/文件`?

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

我在Angular 17中的environment.ts文件中得到了一个属性端点错误

当数组类型被扩展并提供标准数组时,TypeScrip不会抱怨

从类型脚本中元组的尾部获取第n个类型

抽象类对派生类强制不同的构造函数签名

TypeScrip:如何缩小具有联合类型属性的对象

扩展对象的此内容(&Q;)

如何在Nextjs路由处理程序中指定响应正文的类型

有没有更干净的方法来更新**key of T**的值?

如何在TypeScript中将元组与泛型一起使用?

Typescript泛型验证指定了keyof的所有键

递归类型名称

如何在react-router-dom v6中捕获pop事件