基于可选参数存在的Typescript函数返回类型,而不使用函数重载

问题描述

Typescript playground

我的目标是基于可选condition: "CONDITION"参数的存在来返回不同的类型。而且我正在尝试不借助重载来实现这一目标。

type TYPE_1 = "TYPE_1"
type TYPE_2 = "TYPE_2"

type CONDITION = "CONDITION"

function foo(condition?: CONDITION): TYPE_1 | TYPE_2 {
    if (condition) {
        return "TYPE_1";
    }
    else {
        return "TYPE_2";
    }
}

const shouldBeType_1 = foo("CONDITION");    // ERROR: THIS IS BEING EVALUATED AS UNION TYPE: "TYPE_1" | "TYPE_2"
const shouldBeType_2 = foo();               // ERROR: THIS IS BEING EVALUATED AS UNION TYPE: "TYPE_1" | "TYPE_2"

这很容易通过重载来实现:

/* ########################################### */
/* #### THIS IS EASY TO DO WITH OVERLOADS #### */
/* ########################################### */

function foo_overloaded(): TYPE_2
function foo_overloaded(condition: "CONDITION"): TYPE_1
function foo_overloaded(condition?: "CONDITION"): TYPE_1 | TYPE_2 {
    if (condition) {
        return "TYPE_1";
    }
    else {
        return "TYPE_2";
    }
}

const overloaded_shouldBeType_1 = foo_overloaded("CONDITION");   // SUCCESS: THIS IS TYPE_1
const overloaded_shouldBeType_2 = foo_overloaded();              // SUCCESS: THIS IS TYPE_2

没有过载的正确方法是什么?还是我过度复杂化了,在这种情况下重载只是解决方法?

SO上还有一个问题:TypeScript: function return type based on argument,without overloading

建议将接口用作返回类型的映射,例如:

interface Registry {
    A: number,B: string,C: boolean
}

function createType<K extends keyof Registry>(type: K,value: Registry[K]): Registry[K] {
    return value;
}

但是我不能这样做,因为condition"CONDITION" | undefined。那么如何映射undefined类型呢?我也尝试使用条件类型来做到这一点。像这样:

type RETURN_TYPE<T extends undefined | "CONDITION"> = T extends "CONDITION" ? TYPE_1 : TYPE_2;

但是那也不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)