如何在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
相关产品推荐
相关产品推荐

