如何解决JS转TypeScript时出现的@ts-expect-error ts-migrate(2571)报错
可行解决步骤
步骤1:定义数据库返回的股票记录结构
先根据你MongoDB中实际存储的字段,定义对应的TS接口:
interface StockRecord { stock_name: string; stock_value: number; percent_difference: number; // 如果day字段存储的是日期对象,类型改为Date即可 day: string | number; // 有其他存储字段可在此补充对应的类型 }
步骤2:给查询方法添加明确的返回类型
修改findAllOcorrencesOrderByValue方法,指定返回的Promise类型,同时调用MongoDB集合方法时传入泛型约束文档结构:
// 明确方法返回值为包裹StockRecord数组的Promise async findAllOcorrencesOrderByValue(my_investments_collection: string): Promise<StockRecord[]> { console.log("start findAllOcorrences") return new Promise(function(resolve, reject) { MongoDb.MongoClient.connect(url, function(err, db) { if (err) reject(err); var dbo = db?.db(database_name); var mysort:MongoDb.Sort = { "day": -1, "percent_difference": -1 }; // 给collection方法传入StockRecord泛型,指定该集合的文档类型 dbo?.collection<StockRecord>(my_investments_collection) .find() .sort(mysort) .collation({locale: "en_US", numericOrdering: true}) .toArray(function(err, result) { if (err) reject(err); console.log(result); // 此时result类型会自动推断为StockRecord[] resolve(result) db?.close(); }); }); }); }
步骤3:原调用代码无需额外修改即可自动识别类型
修改完方法后,all_ocorrencies会被TypeScript自动推断为StockRecord[]类型,unknown报错会直接消失,你还可以删掉forEach回调中element的any类型注解,获得完整的类型校验能力:
async function get_stocks_saved_on_database(request: any, response: any) { let mongoDatabaseStockOperations = new MongoDatabaseStockOperations() // 自动推断为StockRecord[]类型,无需手动加类型注解 let all_ocorrencies = await mongoDatabaseStockOperations.findAllOcorrencesOrderByValue(Constants.STOCKS_REPORT_COLLECTION) all_ocorrencies.forEach((element) => { response.write(element.stock_name + " | " + element.stock_value + " | " + element.percent_difference + " | " + element.day + "\n") }); response.end() }
临时过渡方案
如果你暂时不想定义完整的接口类型,可以直接给查询方法的返回值标注为Promise<any[]>,即可快速消除报错,但会失去后续的类型校验能力,仅适合短期临时使用。
内容的提问来源于stack exchange,提问作者fabiobh
相关产品推荐
相关产品推荐

