Javascript 在原型中声明TypeScript成员,而不是添加到';这';

Javascript 在原型中声明TypeScript成员,而不是添加到';这';,javascript,typescript,Javascript,Typescript,以下类型脚本: class A { member = "value"; } …编译为: var A = (function () { function A() { this.member = "value"; } return A; })(); 我希望实现以下目标: var A = (function () { function A() { } A.prototype.member = "value"; re

以下类型脚本:

class A {
    member = "value";
}
…编译为:

var A = (function () {
    function A() {
        this.member = "value";
    }
    return A;
})();
我希望实现以下目标:

var A = (function () {
    function A() {
    }

    A.prototype.member = "value";

    return A;
})();
这样做的原因是,我认为后一种构造可能更有效,因为(1)赋值
this.member=“value”
语句不必在每次创建新实例时都执行,(2)实例内存负载将更小

免责声明:我还没有对这两个结构进行基准测试,所以我真的不知道是否是这样

所以我的问题是:是否可以使用类型脚本声明“原型成员”

如果有人能解释为什么类型脚本是这样设计的,我也会很高兴。(见附件)

我理解以这种方式声明可变成员是愚蠢的,但是不可变原语的声明,比如
string
number
,应该可以在原型上设置,对吗

可能的解决办法是:

class A {
    member: string;
}

A.prototype.member = "value";
但是,这对私人成员不起作用:

class A {
    private member: string;
}

A.prototype.member = "value"; // error TS2107: 'A.member' is inaccessible.
是否可以使用类型脚本声明“原型成员”

不,语言现在不允许这样

解决方法

当编译器不满意时。。。断言:

class A {
    private member: string;
}

(<any>A.prototype).member = "value"; // suppressed
A类{
私有成员:字符串;
}

我提出了一个可能的解决方案,也适用于私人会员:

class A {
    private member: string;

    static __init = (() => {
        A.prototype.member = "value";
    })();
}
这很好;所有代码都在类构造中,我避免了转换到
any
,因此仍然可以跟踪对这些私有成员的引用(用于重构等)


当使用这种方法时,在类函数上声明了一个虚拟的
\uuu init
成员。不过这不是一个大问题。

在幕后,它实际上不是在构造函数中执行
this.member=A.prototype.member
吗?我不认为这样做对性能有好处,但也许有人知道。对我来说,我不想为了极小的性能提升而牺牲代码质量。不,事实并非如此。如果你在
prototype
上重新分配
member
,那么在没有显式分配成员值的所有实例上都会看到这种变化。哦,是的,这是真的。我以前从未尝试过在prototype上添加值类型是的,但这是有道理的。顺便说一句,添加的属性越多,分配给
这个
的速度就越慢。太好了!感谢性能比较!顺便说一句,只有在初始化过程中,如果有少量的查找,它才会更快。例如,为了抵消初始化6个字符串,我不得不这样做(在我的电脑上,它们是并列的)。因此,在访问变量~5次后,似乎不值得使用此方法。也许?因此,这似乎取决于情况是否值得。我仍然建议不要费心,因为这些微优化只会导致代码更难维护。使用
any
转换不是一个好方法我的观点。然后我们会忘记该成员的使用位置(重构等)——这是我们首先使用类型脚本的主要原因之一。请您详细说明一下“原型上没有函数是非意识形态的”?我不明白非惯用语的意思:-)i、 e.你不会在野外发现太多的JavaScript代码将成员放在
prototype
上。我当然不记得见过任何这样编写的代码。真的吗?我看到了几个这样的用例:(1)设置对象的默认值,作为$.extend()等的替代品。(2)“类”的效率有很多实例。在类型脚本源代码中,有一个地方将非函数成员分配给原型:很好的解决方案!事实上还不错。