如何运行该TypeScript代码并基于示例实现observer函数?
TypeScript代码运行错误修复与observer函数实现
运行这份TypeScript练习题代码时,用ts-node会触发类型错误:'this'隐式拥有'any'类型,因为它未添加类型注解,错误出现在this.result = a + b;和this.result = a ** b;两行。同时需要完成observer函数,使其记录被观察函数的名称、调用参数及返回结果。
完整修复并实现后的代码如下:
'use strict'; import { WriteStream, createWriteStream } from "fs"; process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString: string = ''; let inputLines: string[] = []; let currentLine: number = 0; process.stdin.on('data', function (inputStdin: string): void { inputString += inputStdin; }); process.stdin.on('end', function (): void { inputLines = inputString.split('\n'); inputString = ''; main(); }); function readLine(): string { return inputLines[currentLine++]; } class Observe { name: string; args: any; result: number; getLastCall(): string { return `${this.name} was called with arguments ${this.args["0"]}, ${this.args["1"]} and returned ${this.result}\n`; } } const observeObj: Observe = new Observe(); const add: Function = (function () { var called: number = 0; // 给this添加类型注解,明确为Observe实例 return function add(this: Observe, a: number, b: number): number { if (called === 0) { called++; this.result = a + b; } return called; } })(); const power: Function = (function () { var called: number = 0; // 给this添加类型注解,明确为Observe实例 return function power(this: Observe, a: number, b: number): number { if (called === 0) { called++; this.result = a ** b; } return called; } })(); /* * Complete the 'observer' function below. * * The function is expected to return a FUNCTION. */ function observer(func: Function): Function { // 返回包装函数,实现观察逻辑 return function(...args: any[]) { // 将原函数的this绑定到observeObj,确保this.result赋值有效 const result = func.call(observeObj, ...args); // 记录函数名称、调用参数和返回结果 observeObj.name = func.name; observeObj.args = args; observeObj.result = result; return result; } } function main() { const ws: WriteStream = createWriteStream(process.env['OUTPUT_PATH']); const input = readLine().trim().split(' '); const x: number = parseInt(input[0]); const y: number = parseInt(input[1]); let observePower: Function = observer(power); observePower(x, y); try { power(1, 1); } catch (err) { ws.write("Please use the already defined functions.\n"); ws.end(); return; } ws.write(observeObj.getLastCall()); let observeAdd: Function = observer(add); observeAdd(x, y); try { add(1, 1); } catch (err) { ws.write("Please use the already defined functions.\n"); ws.end(); return; } ws.write(observeObj.getLastCall()); ws.end(); }
关键说明
修复
this类型错误:
在add和power的返回函数定义中,添加this: Observe类型注解,明确this指向Observe类的实例,消除TypeScript的类型检查报错。实现
observer函数:- 返回一个包装函数,接收任意数量的参数
- 通过
func.call(observeObj, ...args)将原函数的this绑定到全局的observeObj,确保this.result能正确赋值 - 将函数名称、调用参数和返回结果同步到
observeObj中,供getLastCall()方法生成日志内容
内容的提问来源于stack exchange,提问作者shareventure
相关产品推荐
相关产品推荐

