Typescript重载使用参数值来定义另一个参数的类型

问题描述

我有这段代码(简化示例):

Typescript playground

它基本上是一个重载函数,可能会获得3种不同类型的对象,并且将为每种类型调用不同的函数。我通过传递应该定义type类型和返回类型的obj参数来区分调用

type OBJECT_A = "OBJECT_A";
type OBJECT_B = "OBJECT_B";
type OBJECT_C = "OBJECT_C";

type OBJ_IN = OBJECT_A | OBJECT_B | OBJECT_C
type TYPES_IN = "OBJECT_A" | "OBJECT_B" | "OBJECT_C"
type OBJ_OUT = OBJECT_A | OBJECT_B | OBJECT_C

function someFunction(obj: OBJECT_A,type: "OBJECT_A"): OBJECT_A
function someFunction(obj: OBJECT_B,type: "OBJECT_B"): OBJECT_B
function someFunction(obj: OBJECT_C,type: "OBJECT_C"): OBJECT_C
function someFunction(obj: OBJ_IN,type: TYPES_IN): OBJ_OUT {
    if (type === "OBJECT_A") {
        return GET_OBJECT_A(obj as OBJECT_A);   // <<<<< TYPE ASSERTION HERE
    }
    else if (type === "OBJECT_B") {
        return GET_OBJECT_B(obj as OBJECT_B);   // <<<<< TYPE ASSERTION HERE
    }
    else {
        return GET_OBJECT_C(obj as OBJECT_C);   // <<<<< TYPE ASSERTION HERE
    }
}


function GET_OBJECT_A(obj: OBJECT_A): OBJECT_A {
    return obj
}

function GET_OBJECT_B(obj: OBJECT_B): OBJECT_B {
    return obj
}

function GET_OBJECT_C(obj: OBJECT_C): OBJECT_C {
    return obj
}

注意:在此示例中,我将返回类型简化为与obj相同的类型。在我的实际情况下,每种情况下的返回类型都为Partial<OBJECT>

问题

我的问题是为什么Typescript要求这些类型断言?如果我已经在检查type === "OBJECT_A,是否已经很清楚(从重载签名中)obj的类型必须为OBJECT_A

是否有更好的模式来处理?还是我应该坚持使用类型断言?

如果没有类型断言,Typescript将抱怨调用

enter image description here

更新:

使用type参数的想法是避免创建函数来检查obj是否为A | B | C类型,例如function IS_OBJECT_A(obj) : obj is OBJECT_A,等等。我必须检查属性或类似的东西。这个想法是,当我传递type: "OBJECT_A"时,唯一允许它的重载调用应该确保obj当然是obj: OBJECT_A

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...