Typescript 函数,它接受具有任意数量参数的函数并返回具有相同参数的函数
已经有类似的问题了,但我觉得没有一个能完全回答这个问题 我试图创建的是一个函数,它接受另一个具有任意数量和类型参数的函数,但返回一个已知的返回类型,执行修改,并返回具有相同参数和返回类型的函数 例如,如果我有一个接口A和函数B,它接受一个字符串和一个对象:Typescript 函数,它接受具有任意数量参数的函数并返回具有相同参数的函数,typescript,Typescript,已经有类似的问题了,但我觉得没有一个能完全回答这个问题 我试图创建的是一个函数,它接受另一个具有任意数量和类型参数的函数,但返回一个已知的返回类型,执行修改,并返回具有相同参数和返回类型的函数 例如,如果我有一个接口A和函数B,它接受一个字符串和一个对象: interface A<T extends string>{ a: string, b: number, c: T } function B<T extends string>(arg1: T, arg2
interface A<T extends string>{
a: string,
b: number,
c: T
}
function B<T extends string>(arg1: T, arg2: {a: string, b: number}): A<T>{
return {...arg2, c: arg1}
}
我不知道该怎么做,也不知道这是否可能。任何帮助都会得到感谢。表面上看,你只需要使用
U扩展任何[]
和(…args:U)=>…
,它会让你调用C(B,“你好世界”)
,就像这样。但是你马上就会遇到编译器无法处理的高阶函数操作问题D
被推断为一种函数类型,其中包含any
,位于您希望看到“Hello World”
的位置。TS中没有完整的类型统一(请参阅),TS3.4中引入的高阶函数内容也不包括这种情况。我可以写一个答案,说明同样的情况,但我不确定您的问题是否主要是关于解决编译器错误(在这种情况下,问题中的示例代码应该删除高阶的内容),或者关于完全统一的问题(在这种情况下,问题中的示例代码应该以U扩展任何[]
)开始)。这实际上对我来说非常有效。对我来说,问题是我想为函数D的参数保留类型信息,但我不知道怎么做。我认为我的错误是认为你已经扩展了任何。使用我的特定代码,它实际上是在推断D的正确返回类型。你确定吗?输出的类型将允许您调用C(B,“helloworld”)(“再见世界”{a:,B:1})
和“再见世界”
应该是一个错误。如果这非常适合您,那么也许我们可以将您的示例代码更改为如下内容:?我明白您的意思。我认为我过于简化了示例代码,遗漏了一些重要的东西。让我看看我能不能做得更好。。。
function C<T extends string>(func: () => A<T>,arg2: T): () => A<T>;
function C<T extends string, U>(func: (args: U) => A<T>, arg2: T): (args: U) => A<T>;
function C<T extends string, U>(func: (args: U) => A<T>, arg2: T): (args: U) => A<T>{
return (args: U) => {
const original = func(args)
const modified = {...original, c: arg2}
return modified
};
}
const D = C(B, "Hello World")
/*No overload matches this call.
No overload matches this call.
Overload 1 of 2, '(func: () => A<string>, arg2: string): () => A<string>', gave the following error.
Argument of type '<T extends string>(arg1: T, arg2: { a: string; b: number; }) => A<T>' is not assignable to parameter of type '() => A<string>'.
Overload 2 of 2, '(func: (args: unknown) => A<string>, arg2: string): (args: unknown) => A<string>', gave the following error.
Argument of type '<T extends string>(arg1: T, arg2: { a: string; b: number; }) => A<T>' is not assignable to parameter of type '(args: unknown) => A<string>'.*/
function C<T extends string>(func: () => A<T>,arg2: T): () => A<T>;
function C<T extends string, U>(func: (...args: U[]) => A<T>, arg2: T): (...args: U[]) => A<T>;
function C<T extends string, U>(func: (...args: U[]) => A<T>, arg2: T): (...args: U[]) => A<T>{
return (...args: U[]) => {
const original = func(...args)
const modified = {...original, c: arg2}
return modified
};
}
const D = C(B, "Hello World")
/*No overload matches this call.
Overload 1 of 2, '(func: () => A<string>, arg2: string): () => A<string>', gave the following error.
Argument of type '<T extends string>(arg1: T, arg2: { a: string; b: number; }) => A<T>' is not assignable to parameter of type '() => A<string>'.
Overload 2 of 2, '(func: (...args: unknown[]) => A<string>, arg2: string): (...args: unknown[]) => A<string>', gave the following error.
Argument of type '<T extends string>(arg1: T, arg2: { a: string; b: number; }) => A<T>' is not assignable to parameter of type '(...args: unknown[]) => A<string>'.
Types of parameters 'arg1' and 'args' are incompatible.
Type 'unknown' is not assignable to type 'string'.*/