【问题标题】:Function overloads with optional parameters带有可选参数的函数重载
【发布时间】:2018-06-27 04:21:19
【问题描述】:

我在 Typescript 中尝试函数重载,但出现以下错误:

错误:(2, 5) TS2394: 重载签名与函数实现不兼容。

我不明白如何解决此错误。任何帮助将不胜感激。

create(key: string | TextKeys, reKey: string | TextKeys, params?: ObjectLiteral<string>, subkeys?: { [key: string]: string }, selector?: Selector): Either<EError, (AOutput | ROutput)[]>;
create(key: string | TextKeys, params?: ObjectLiteral<string>, subkeys?: { [key: string]: string }, selector?: Selector): Either<EError, AOutput>;
create(key: string | TextKeys, reKey?: string | TextKeys, params?: ObjectLiteral<string>, subkeys?: { [key: string]: string }, selector: Selector = selectRandom) {
    const output: Either<EError, AOutput> = this.createAOutputs(key, params, subkeys).map(selector);
    if (reKey !== undefined) {
        return List.fromArray([output, this.createROutputs(reKey, params, subkeys)]).sequenceEither<EError, AOutput | ROutput>().map(arr => _.flatten(arr.toArray())) as Either<EError, (AOutput | ROutput)[]>;
    } else {
        return output;
    }
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我不明白如何解决此错误。任何帮助将不胜感激。

    您的最后一个函数签名必须适用于所有可能的重载。一个快速的技巧来展示什么会起作用:

    create(key: string | TextKeys, reKey: string | TextKeys, params?: ObjectLiteral<string>, subkeys?: { [key: string]: string }, selector?: Selector): Either<EError, (AOutput | ROutput)[]>;
    create(key: string | TextKeys, params?: ObjectLiteral<string>, subkeys?: { [key: string]: string }, selector?: Selector): Either<EError, AOutput>;
    create(...iWorkWithAllOptions:any[]) { // NOTICE 
        // implement
    }
    

    【讨论】:

    • 但是我会失去对实现的类型检查。从技术上讲,我的函数签名适用于上述两个重载。
    • 对于调用者来说仍然是类型安全的。该实现失去了类型安全性,但也就是说,您的函数体将始终需要满足所有重载情况。
    • 有没有办法让它适应第二种重载情况并在实现中保持类型安全?值得注意的是TextKeys 确实适合ObjectLiteral&lt;string&gt; 的类型。您认为这是造成问题的原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多