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

如何运行该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();
}

关键说明

  1. 修复this类型错误:
    在add和power的返回函数定义中,添加this: Observe类型注解,明确this指向Observe类的实例,消除TypeScript的类型检查报错。

  2. 实现observer函数:

    • 返回一个包装函数,接收任意数量的参数
    • 通过func.call(observeObj, ...args)将原函数的this绑定到全局的observeObj,确保this.result能正确赋值
    • 将函数名称、调用参数和返回结果同步到observeObj中,供getLastCall()方法生成日志内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:06:22