问题描述
它基本上是一个重载函数,可能会获得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将抱怨调用:
更新:
使用type
参数的想法是避免创建函数来检查obj
是否为A | B | C
类型,例如function IS_OBJECT_A(obj) : obj is OBJECT_A
,等等。我必须检查属性或类似的东西。这个想法是,当我传递type: "OBJECT_A"
时,唯一允许它的重载调用应该确保obj
当然是obj: OBJECT_A
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)