Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 函数,它接受具有任意数量参数的函数并返回具有相同参数的函数_Typescript - Fatal编程技术网

Typescript 函数,它接受具有任意数量参数的函数并返回具有相同参数的函数

Typescript 函数,它接受具有任意数量参数的函数并返回具有相同参数的函数,typescript,Typescript,已经有类似的问题了,但我觉得没有一个能完全回答这个问题 我试图创建的是一个函数,它接受另一个具有任意数量和类型参数的函数,但返回一个已知的返回类型,执行修改,并返回具有相同参数和返回类型的函数 例如,如果我有一个接口A和函数B,它接受一个字符串和一个对象: interface A<T extends string>{ a: string, b: number, c: T } function B<T extends string>(arg1: T, arg2

已经有类似的问题了,但我觉得没有一个能完全回答这个问题

我试图创建的是一个函数,它接受另一个具有任意数量和类型参数的函数,但返回一个已知的返回类型,执行修改,并返回具有相同参数和返回类型的函数

例如,如果我有一个接口A和函数B,它接受一个字符串和一个对象:

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'.*/