繁体   English   中英

“函数”类型的参数不能分配给'(... args:any [])=> void'类型的参数

[英]Argument of type 'Function' is not assignable to parameter of type '(…args: any[]) => void'

function on(event: string, listener: Function) {
    console.log('on event: ', event, 'typeof listener:', typeof (listener));
    listener();
}

function on1(event: string, listener: (...args: any[]) => void) {
    console.log('on event: ', event, 'typeof listener:', typeof (listener));
    listener();
}

function createCallback(a: number): Function {
    let f = (a: number) => {
        console.log('return a:', a);
        return (a: number) => { return a + 1 };
    };
    return f(a);
}

let f = createCallback(1);
console.log('type of f', typeof (f));
// on("start", f);
on1("start", f);

在上面的代码中, on("start", f)工作正常但是on1("start", f); 返回错误

main.ts:22:14 - error TS2345: Argument of type 'Function' is not assignable to parameter of type '(...args: any[]) => void'.
  Type 'Function' provides no match for the signature '(...args: any[]): void'.

22 on1("start", f);
                ~

如果我删除createCallbackFunction类型断言, on1("start", f)工作,是不是Function一般类型来表示闭包?

原始问题来自此提交, https://github.com/DefinitelyTyped/DefinitelyTyped/commit/96545154cc6488643a7064a6dc4ec9726c7af12a#diff-7d84e08967cded0b99ed4328aab0a1a8L291

我不明白为什么他将Function更改为(...args: any[]) => void ,这使我的代码中断。

有一个建议允许这样的东西,因为Function可以赋值给(...args: any[]) => any 这不是当前行为的原因是:

Function的初衷是不可调用。 换句话说,函数类型的函数应该像其他类型未知,但不可调用。 我们已经放宽了这个限制,通过特殊的套管在编译器中赋予Function一个可调用的行为。 我们已经讨论过将此设为--noImplicitAny错误,因为调用函数实际上是不安全的。

如果这对您很重要,我建议您对该建议进行投票。

我通常会从Function保持一种表达函数签名的类型安全。 对于您的情况,我会使用以下内容:

function on(event: string, listener: (...args: any[]) => void) {
    console.log('on event: ', event, 'typeof listener:', typeof (listener));
    listener();
}

function createCallback(a: number)  { // we can omit the return type or be explicit and type it as (a: number) => number
    let f = (a: number) => {
        console.log('return a:', a);
        return (a: number) => { return a + 1 };
    };
    return f(a);
}

let f = createCallback(1); // (a: number) => number 
on("start", f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM