typescript - 打字稿重载使用参数值来定义另一个参数的类型
问题描述
我有这段代码(简化示例):
它基本上是一个重载函数,可能会获得 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
必须是 type OBJECT_A
?
有没有更好的模式来处理这个?还是我应该坚持类型断言?
如果没有类型断言,Typescript 将抱怨调用:
更新:
参数的想法type
是避免创建函数来检查是否obj
是 type A | B | C
, likefunction IS_OBJECT_A(obj) : obj is OBJECT_A
等。我必须检查属性或类似的东西。这个想法是,当我通过type: "OBJECT_A"
唯一允许它的重载调用时,应该确保它obj
当然是obj: OBJECT_A
.
解决方案
推荐阅读
- python - 定义self.sock时,获取errors.python
- java - Scala:相当于 np.digitize 来分桶数据
- c++ - clang 实现 char8_t 的方式是否存在缺陷,或者标准的某些暗角是否禁止优化?
- bash - 如何 grep 序列并创建不同的文件?
- hibernate - 如何查找结果是否落在 lucene 索引中的两个日期之间?
- python-3.x - 检测字符串类型
- android - 如何在服务存活时多次启动服务
- ansible - 在字典中迭代字典
- html - 在页面底部居中 div 的问题
- jquery - jQgrid .clearsearchclass 正在重新加载而不是清除搜索字段