【问题标题】:TypeScript allow for optional arguments - overloading methodsTypeScript 允许可选参数 - 重载方法
【发布时间】:2018-07-06 03:19:14
【问题描述】:

我在一个类上有这个方法签名:

lock(key: string, opts: any, cb?: LMClientLockCallBack): void;

如果用户这样使用它:

lock('foo', null, (err,val) => {

});

他们会得到正确的输入。但是,如果他们省略 options 参数并执行此操作:

lock('foo', (err,val) => {

});

然后tsc 将回调函数视为any 类型,就像这样:

有什么方法可以让用户避免将空对象或 null 作为第二个参数传递,并将回调转移过来?

我尝试将方法重载,分成两个定义:

  lock(key: string, cb: LMClientLockCallBack, n?: LMClientLockCallBack) : void;

  lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }

但是还是不能编译,有新问题:

如果我试试这个:

  lock(key: string, cb: LMClientLockCallBack) : void;

  lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }

我明白了:

肯定有办法解决这个问题?

【问题讨论】:

    标签: typescript typescript2.0 tsc


    【解决方案1】:

    在 TypeScript 中重载方法时,实现不算作重载之一。因此,您应该创建三个函数定义:两个用于不同的重载,正如您已经完成的那样,第三个 - 带有可选参数和实际实现,它在您的代码中错误地连接到第二个重载定义。所以你会有:

    lock(key: string, cb: LMClientLockCallBack) : void;
    lock(key: string, opts: any, cb: LMClientLockCallBack): void;
    
    lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }
    

    所以,如果第二个参数是回调 - 用户将获得第一个重载类型,如果是其他任何东西,但第三个参数是回调 - 第二个重载类型。但在这两种情况下,它们都会调用相同的实现,就像在纯 JavaScript 中一样。

    【讨论】:

    • the implementation doesn't count as one of overloads. 那条语句拯救了我的一天.....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多