当我使用 ts-node 编写 运行 脚本时,为什么 for..in 不起作用?

Why for..in do not work when I run script with ts-node?

这是./src/repro.ts

class P {
    do() { console.log('d'); }
}

const x = new P();

console.log('for in:');
for (const key in x) {
    console.log(key);
}

我正在使用这个 ./tsconfig.json 编译它(也尝试过完全没有配置,或者使用 ES2019 目标和 lib):

{
    "compilerOptions": {
        "target": "ES6",
        "module": "commonjs",
        "lib": ["ES6"],
        "esModuleInterop": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "moduleResolution": "node",
        "sourceMap": false,
        "outDir": "dist",
        "baseUrl": ".",
        "paths": {
            "*": ["node_modules/*", "src/types/*"]
        }
    },
    "include": ["src/**/*"]
}

像这样:

> tsc -v                   
Version 4.3.5
> tsc ./src/repro.ts

产生这个 ./src/repro.js

var P = /** @class */ (function () {
    function P() {
    }
    P.prototype["do"] = function () { console.log('d'); };
    return P;
}());
var x = new P();
console.log('for in:');
for (var key in x) {
    console.log(key);
}

我运行它(节点v10,12,14,16相同):

> node ./src/repro.js
for in:
do

我的问题是,为什么这个命令不输出方法“do”:

> ts-node ./src/repro.ts   
for in:

正如@Phil 所说,您不能使用 for..in 遍历对象的方法,但可以使用 Object.getOwnPropertyNames() 为您提供方法名称数组并遍历这样你就可以做到:

class P {
    do() { console.log('d'); }
}

const x = new P();

// Logs your properties
for (const key in x) {
    console.log(key);
}

// Logs your methods names
for (const key of Object.getOwnPropertyNames(x.__proto__) {
    console.log(key);
}
// ["constructor", "do"]

请记住,数组还将包含构造方法名称。

我的直接错误是这个命令:tsc ./src/repro.ts。当你编译一个文件时,tsc 没有使用 tsconfig.json,所以它生成了一个 pre ES6 代码,它没有 类 和方法,for..in 适用于它。