具有公共属性的Typescript类导致一个空的JavaScript对象

时间:2019-03-14 11:10:30

标签: javascript typescript web

我创建了以下课程:

iScrollContainer

稍后在程序中,我尝试通过以下方式使用它:

  class TestInput {
        public a: boolean;
        public b: boolean;
        public c: boolean;

    }

什么都不做,以后导致错误。在Chrome let template = new TestInput(); for (const key in template) { if (template.hasOwnProperty(key)) { template[key] = false; } } 中调试时似乎为空。

看看生成的JavaScript,我看到TestInput是通过以下方式定义的(有点空):

template

我在做什么错? 谢谢!

2 个答案:

答案 0 :(得分:3)

即使声明了属性,也没有任何东西实际创建它们。仅当为其分配了值时,才会创建公共属性。

如果要确保始终创建它们,请在声明中包括一个初始化程序:

class TestInput {
    public a: boolean = false;
    public b: boolean = false;
    public c: boolean = false;
}

或在构造函数中分配给它们,等等。

对于TypeScript的公共属性,这是正确的,但对于JavaScript自己的public field declarations(在Chrome的V8中现在没有任何标志,现在已交付)是不正确的。声明创建属性:

class TestInput {
    a;
    b;
    c;
}
const t = new TestInput();
console.log("a" in t); // true

答案 1 :(得分:2)

这是预期的行为。类字段声明实际上对发出的Javascript没有任何作用。它们在那里只是用于类型检查。

如果将初始化程序添加到该字段,则该对象将具有预期的字段。

frmt= '%H:%M:%S'
df['column name'] = pd.to_datetime(df['column name'],format=frmt).dt.time

还有一个选项strictPropertyInitialization用于检查所有属性是否已初始化(但需要class TestInput { public a: boolean = false; public b: boolean = false; public c: boolean = false; }

  

确保在构造函数中初始化未定义的类属性。此选项要求启用--strictNullChecks才能生效。