TypeScript:why is';t`Function`assignable to`(…args:any[])=>;有吗?
尽管使用typeTypeScript: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
函数
几乎从来都不是一个好主意,但我希望我编写的类型定义与此类型兼容。特别是,当函数
传递给通用函数时:
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);