Jest.js 如何在typescript中模拟对象的typeof?

c86crjj0  于 12个月前  发布在  Jest
关注(0)|答案(1)|浏览(136)

今天有一个奇怪的问题,我有一个bug,如果typeof(transaction)返回object而不是对象名称,代码的行为会有所不同。我修复了函数中transactionType参数的问题,但为了向后兼容,我不得不保留旧的逻辑。

let userId: string;
    
    if (transactionType === TransactionTypes.A) {
      userId = (transaction as TransactionA).userid;
    } else if (transactionType === TransactionTypes.B) {
      userId = (transaction as TransactionB).user.id;
    } else if (
      transactionType === TransactionC
    ) {
      userId = (transaction as TransactionC).userId;
    } else {
      console.log("LEGACY TRANSACTION TYPE USED...");
      // Legacy code, caused an issue when typeof returns "object"
      userId =
        (transaction as TransactionA).userid ||
        (transaction as TransactionC).userId ||
        (transaction as TransactionB).user.id;
    }

typeof返回object时,我得到userIdnull返回。我希望能够测试我的新TransactionType逻辑是否确实工作。
为此,我需要进行一个typeof返回object的测试。我尝试将以下内容传递给我的函数,但我的linter出现了类型错误。
下面是函数声明:

private getTransactionValues(
    transaction:
      | TransactionA
      | TransactionB
      | TransactionC,
    transactionType?: TransactionTypes,
    ): TransactionValues {
       //...
    }

我尝试让typeof返回object

const transaction: TransactionB = (generateRandomTransaction() as Object);

getTransactionValues({
  transaction,
//~~~~~~~~~~~~ ^ error linter "object not TransactionA | TransactionB | TransactionC"
  transactionType: TransactionType.A,
});

是否可以用我的对象模拟一个属性,使它在传递给函数typeof时返回类型object

zysjyyx4

zysjyyx41#

好吧!在一直玩下去之后,发现你可以简单地转换为unknown,然后转换为目标类型,这将使typeof函数返回object,下面是一个代码示例:

const transaction: TransactionB = generateRandomTransaction() as unknown as TransactionB;

console.log(typeof(transaction));

// output: object

显然,通过unkown强制转换传递足以使typescript在转换为JavaScript后创建object类型。

相关问题