Return 通用函数类型
Return type of generic function
我正在尝试使 getResults
函数 return 成为正确的类型,但目前仍坚持使用:
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);
代码只是一个示例,在生产中 getResults
函数用于合并分页请求的结果(fn
在这种情况下是请求函数)
所以,我不确定这是否也涵盖了您生产所需的内容。但是 return 类型看起来像这样:
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);
编辑:
我实际上不确定为什么有问题的代码没有提供正确的 IntelliSense,这对我来说很有意义。
但我看到的是您使用了三种泛型类型 T
、R
和 P
。我的想法是,基本上你只有 2 种类型需要担心,它们是参数和方法的结果。
我基本上是说,getValue
的 IResponse
中的任何类型都将是 myResults
函数的最终输出。
我正在尝试使 getResults
函数 return 成为正确的类型,但目前仍坚持使用:
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);
代码只是一个示例,在生产中 getResults
函数用于合并分页请求的结果(fn
在这种情况下是请求函数)
所以,我不确定这是否也涵盖了您生产所需的内容。但是 return 类型看起来像这样:
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);
编辑: 我实际上不确定为什么有问题的代码没有提供正确的 IntelliSense,这对我来说很有意义。
但我看到的是您使用了三种泛型类型 T
、R
和 P
。我的想法是,基本上你只有 2 种类型需要担心,它们是参数和方法的结果。
我基本上是说,getValue
的 IResponse
中的任何类型都将是 myResults
函数的最终输出。