You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中mock对象的typeof返回值?

问题描述

我遇到一个特殊问题:当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'时,userId会得到null值。我希望测试新的TransactionType逻辑是否有效,因此需要构造一个typeof返回'object'的测试场景,但尝试传入对象时,代码检查工具抛出类型错误。

函数声明:

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

我的尝试代码(触发类型错误):

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

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

想问:是否可以通过mock对象的属性,使其在typeof函数中返回'object'类型?

解决方案
  • 构造typeof返回'object'的场景:
    在JS/TS中,typeof对普通对象、数组、null都会返回'object'。要让typeof(transaction)返回'object',无需mock特殊属性,直接构造这类值即可:

    • 传入null:typeof null的结果就是'object'
    • 传入无类型标识的纯字面量对象(比如{})
  • 绕过类型检查的方法:
    因为函数参数要求是TransactionA | TransactionB | TransactionC类型,你可以用双重类型断言绕过TSLint/ESLint的检查:

    // 用null构造测试场景
    const mockTx = null as unknown as TransactionA;
    getTransactionValues(mockTx, TransactionTypes.A);
    // 此时typeof(mockTx) === 'object'
    
    // 用纯字面量对象构造测试场景
    const mockTx = {} as unknown as TransactionB;
    getTransactionValues(mockTx, TransactionTypes.B);
    // 此时typeof(mockTx) === 'object'
    
  • 测试旧逻辑分支:
    如果要验证else分支的旧逻辑,只需不传transactionType参数,同时传入typeof为'object'的实例:

    const legacyTx = {} as unknown as TransactionA | TransactionB | TransactionC;
    getTransactionValues(legacyTx);
    // 代码会进入旧逻辑分支,触发原本的typeof判断问题
    

内容的提问来源于stack exchange,提问作者MathieuAuclair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:17:23