【问题标题】:Typescript arrow functions overloads error 2322Typescript 箭头函数重载错误 2322
【发布时间】:2022-12-02 21:48:35
【问题描述】:

下面的代码工作正常,但它给出了 resolve 常量的错误。

const resolve: Resolve
Type '(param: "case 1" | "case 2" | "case 3") => boolean | "string" | 1000' is not assignable to type 'Resolve'.(2322)
// Overloads
type Resolve = {
    (): false;
    (param: 'case 1'): string;
    (param: 'case 2'): number;
    (param: 'case 3'): true;
};

const resolve: Resolve = (param) => {
    switch (param) {
        case 'case 1':
            return 'string';
        case 'case 2':
            return 1000;
        case 'case 3':
            return true;
        default:
            return false;
    }
};

const result = {
    first: resolve('case 1'),
    second: resolve('case 2'),
    third: resolve('case 3'),
    none: resolve()
};

知道如何解决吗?

【问题讨论】:

    标签: typescript function arrow-functions constructor-overloading


    【解决方案1】:

    通常情况下,重载函数的实现签名与重载签名不完全兼容。当您使用重载语法时,TypeScript 对此相当放松。

    在您的情况下,由于您没有使用重载语法,因此您必须使用类型断言(在当然该函数对于重载的行为是否正确):

    const resolve = ((param?: "case 1" | "case 2" | "case 3"): string | number | true | false => {
        switch (param) {
            case "case 1":
                return "string";
            case "case 2":
                return 1000;
            case "case 3":
                return true;
            default:
                return false;
        }
    }) as Resolve;
    

    (我还为 param 添加了一个类型注释和一个返回类型注释,只是为了更好的衡量,尽管在实现签名中真正松散的情况并不少见。)

    Playground example


    仅 FWIW,改用函数重载语法 (playground link):

    function resolve(param: "case 1"): string;
    function resolve(param: "case 2"): number;
    function resolve(param: "case 3"): true;
    function resolve(): false;
    function resolve(param?: "case 1" | "case 2" | "case 3"): string | number | true | false {
        switch (param) {
            case "case 1":
                return "string";
            case "case 2":
                return 1000;
            case "case 3":
                return true;
            default:
                return false;
        }
    };
    
    type Resolve = typeof resolve;
    

    ...但这并不总是可能的,在没有实际实现它的情况下必须定义类型的情况并不少见(例如,在 API 的回调类型中)。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2018-01-31
      • 2017-01-04
      • 1970-01-01
      • 2019-12-17
      • 2022-01-17
      相关资源
      最近更新 更多