Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型脚本类:构造函数和方法_Javascript_Typescript - Fatal编程技术网

Javascript 类型脚本类:构造函数和方法

Javascript 类型脚本类:构造函数和方法,javascript,typescript,Javascript,Typescript,我试图在我的Typescript类中避免双重声明 在我写这样的课程之前: module ModuleName { export class ClassName { public method: () => void; constructor( private dependency: any ) { this.method = () => { dependency.

我试图在我的Typescript类中避免双重声明

在我写这样的课程之前:

module ModuleName {
    export class ClassName {
        public method: () => void;

        constructor(
            private dependency: any ) {
            this.method = () => {
                dependency.someUse();
            };
        }
    }
}
但是方法类型的声明(此处为
public方法:()=>void;
)看起来毫无用处,尤其是当您已经有了一个声明它的接口时。所以我想写:

module ModuleName {
    export class ClassName {
        constructor(
            private dependency: any ) { }

        public method = () => {
            this.dependency.someUse();
        };

    }
}
注意:为了避免在声明之前使用警告
变量XXX
,我们必须将方法放在构造函数之后

但是现在,如果我们在构造函数中使用我们的方法,我们会再次收到有关此方法的警告:

module ModuleName {
    export class ClassName {
        constructor(
            private dependency: any ) {
            this.method(); // warning here
        }

        public method = () => {
            this.dependency.someUse();
        };

    }
}
因此,我的问题是:我们应该如何正确地编写我们的类?


注意:由于typescript编译器更正了声明的顺序,这没什么大不了的,我只想知道是否可以编写没有双重声明和警告的类。

这听起来像是TSLint的错误。您在使用WebEssentials时有任何变化吗

您可能希望禁用此规则,因为您所说的它看起来有问题。WebEssentials从用户主目录加载
tslint.json
%userprofile%
)。您应该能够在那里找到一个tslint.json文件。这是您可以启用/禁用规则的地方

听起来下面的规则中有一个bug

no use before declare
不允许在变量声明之前使用它们`

您可以通过以下方式添加(或更改)配置来禁用此规则:

"no-use-before-declare": false

有关tslint及其规则的更多信息可在此处找到:

您在声明之前使用的错误
变量XXX
是由于将类方法声明为类属性而导致的

而不是像这样声明您的方法:

public method = () => {
module ModuleName {
    export class ClassName {
        constructor(private dependency: any ) { }

        public method() {
            this.dependency.someUse();
        }
    }
}
声明如下:

public method() {
所以你的班级看起来是这样的:

public method = () => {
module ModuleName {
    export class ClassName {
        constructor(private dependency: any ) { }

        public method() {
            this.dependency.someUse();
        }
    }
}

最后,我认为删除这个警告是个坏主意,因为它在某些情况下非常有用

但我找到了解决问题的方法: 如果我们将构造函数移动到类的末尾,我们将不再收到警告:

module ModuleName {
    export class ClassName {

        public method = () => {
            this.dependency.someUse();
        };

        constructor(
            private dependency: any ) {
            this.method();
        }

    }
}
如果我们看一下生成的JS,就会更容易理解发生了什么:构造函数的参数仍然放在生成函数的开头:

var ModuleName;
(function (ModuleName) {
    var ClassName = (function () {
        function ClassName(dependency) {
            var _this = this;
            this.dependency = dependency;
            this.method = function () {
                _this.dependency.someUse();
            };
            this.method();
        }
        return ClassName;
    })();
    ModuleName.ClassName = ClassName;
})(ModuleName || (ModuleName = {}));

最后一个例子中的“警告”是怎么回事?当我把代码粘贴到操场上时没有错误。那不好。如果问题尚未解决,则应向TSLint报告。