首页 > 解决方案 > 打字稿重载使用参数值来定义另一个参数的类型

问题描述

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

打字稿游乐场

它基本上是一个重载函数,可能会获得 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.

标签: typescriptcastingoverloadingtype-assertion

解决方案


推荐阅读