typescript - 泛型函数的返回类型

标签 typescript generics

我正在尝试使 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

代码只是一个示例,在生产中 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

编辑: 我实际上不太确定为什么有问题的代码没有给出正确的 IntelliSense,这对我来说是有意义的。

但我可以看到,您使用了三种泛型类型 TRP。我的想法是,基本上你只需要担心两种类型,即参数和方法的结果。

我基本上是说,getValueIResponse 中的任何类型都将是 myResults 函数的最终输出。

关于typescript - 泛型函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72057698/

相关文章:

backbone.js - 使用 typescript 的 Marionette 模块

swift - 泛型的泛型? A<T<U>> 类?

typescript - 是否可以推断类型参数的类型?

reactjs - 如何使用 RouteComponentProps 测试 React 组件?

c# - 由于泛型类型推断的限制,无法使用泛型来改进 API

java泛型,未经检查的警告

c# - 由于通用基类,不能使用多态性

node.js - vscode : Can't break on any breakpoint with Visual Studio code when launching with nodemon

使用代码生成的 graphql 代码时出现 Typescript 错误 "Property ' 0' does not exist on type X"

reactjs - 尝试将调度函数包装在react redux中