TypeScript:why is';t`Function`assignable to`(…args:any[])=>;有吗?

TypeScript:why is';t`Function`assignable to`(…args:any[])=>;有吗?,typescript,Typescript,尽管使用type函数几乎从来都不是一个好主意,但我希望我编写的类型定义与此类型兼容。特别是,当函数传递给通用函数时: declare var a: (...args: any[]) => any; declare var b: Function; a = b; // Error: // Type 'Function' is not assignable to type '(...args: any[]) => any'. // Type 'Function' provides n

尽管使用type
函数
几乎从来都不是一个好主意,但我希望我编写的类型定义与此类型兼容。特别是,当
函数
传递给通用函数时:

declare var a: (...args: any[]) => any;
declare var b: Function;
a = b;

// Error:
// Type 'Function' is not assignable to type '(...args: any[]) => any'.
//  Type 'Function' provides no match for the signature '(...args: any[]): any'
声明函数foo(bar:(…args:any[])=>T:T;
声明var-baz:Function;
富(baz),;

它失败时也会出现同样的错误,而期望它工作并推断
T
any
似乎是合理的。您可以尝试以下操作:

declare function foo<T>(bar: (...args: any[]) => T): T;
declare var baz: Function;
foo(baz);
接口函数与typedReturn扩展函数{
(…args:any[]):T;
}
声明函数foo(bar:FunctionWithTypedReturn):T;
声明var baz:FunctionWithTypedReturn;
富(baz),;

在您的示例中,
a
b
更具体。因此,您不能将
b
分配给更具体的
a
,这是有道理的。如果要强制类型兼容,请使用类型断言(
as
)。我看不出它有多具体<代码>函数也可以通过
new
调用。因此
函数
应该与
((…args:any[])=>any)和(new(…args:any[])=>object)相同。我们可以将此类型分配给
(…args:any[])=>T
。但不是
功能
。为什么?请注意,我们可以将任何其他函数类型分配给
a
。例如,
(x:number)=>void
,即使是
(x:number)=>也不起作用。但是为什么
功能不能像这样开箱即用呢?为什么
(…args:any[])=>any)和(new(…args:any[])=>object)
函数之间有区别?我遗漏了什么吗?我不知道答案:(你可以看到。
interface FunctionWithTypedReturn<T> extends Function {
    (...args: any[]): T;
}

declare function foo<T>(bar: FunctionWithTypedReturn<T>): T;

declare var baz: FunctionWithTypedReturn<number>;

foo(baz);