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
TypeScript类方法的语法_Typescript_Typescript Eslint - Fatal编程技术网

TypeScript类方法的语法

TypeScript类方法的语法,typescript,typescript-eslint,Typescript,Typescript Eslint,在TypeScript中,我可以定义一些方法,比如实方法(Foo)或者一个属性,该属性获得一个分配的方法(Baz) 它们相等吗 有区别吗 我应该使用什么语法 我可以使用typescript eslint禁止其中一个吗 它们并不等同Baz不会出现在TestClass的原型上(Foo会),但它将是每个实例上的一个属性。正如公认的答案所说,Baz不在TestClass的原型上,但Foo是。以下测试代码帮助我理解了这意味着什么: class TestClass { public Baz = ()

在TypeScript中,我可以定义一些方法,比如实方法(
Foo
)或者一个属性,该属性获得一个分配的方法(
Baz

  • 它们相等吗
  • 有区别吗
  • 我应该使用什么语法
  • 我可以使用
    typescript eslint
    禁止其中一个吗

  • 它们并不等同
    Baz
    不会出现在
    TestClass
    的原型上(
    Foo
    会),但它将是每个实例上的一个属性。

    正如公认的答案所说,
    Baz
    不在
    TestClass
    的原型上,但
    Foo
    是。以下测试代码帮助我理解了这意味着什么:

    class TestClass {
        public Baz = (): void => {
            console.log("Baz");
        }
    
        public Foo(): void {
            console.log("Foo");
        }
    }
    
    class SubClass1 extends TestClass { }
    class SubClass2 implements TestClass {
        public Baz = (): void => {
            console.log("Baz of SubClass2");
        }
    
        public Foo(): void {
            console.log("Foo of SubClass2");
        }
    }
    
    TestClass.prototype.Baz = (): void => { console.log("Baz on prototype"); } // has no effect because Baz not on prototype
    TestClass.prototype.Foo = (): void => { console.log("Foo on prototype"); }
    
    const a = new TestClass();
    const b = new TestClass();
    const c = new TestClass();
    const d = new SubClass1();
    const e = new SubClass2();
    
    a.Baz = (): void => { console.log("Baz of a"); }
    a.Foo = (): void => { console.log("Foo of a"); }
    b.Baz = (): void => { console.log("Baz of b"); }
    b.Foo = (): void => { console.log("Foo of b"); }
    
    console.log("a:");
    a.Baz();
    a.Foo();
    console.log("b:");
    b.Baz();
    b.Foo();
    console.log("c:");
    c.Baz();
    c.Foo();
    console.log("d:");
    d.Baz();
    d.Foo();
    console.log("e:");
    e.Baz();
    e.Foo();
    
    您将获得以下输出:

    a:
    Baz of a
    Foo of a
    b:
    Baz of b
    Foo of b
    c:
    Baz
    Foo on prototype
    d:
    Baz
    Foo on prototype
    e:
    Baz of SubClass2
    Foo of SubClass2
    
    所以篡改
    TestClass.prototype.Baz
    没有效果。 但是,更改
    TestClass.prototype.Foo
    ,将更改新实例的
    Foo
    的默认实现。
    但是,每个实例都可以覆盖
    Foo
    Baz
    ,而不影响任何其他实例。

    完全由您决定。并且没有必要禁止一个。请注意,不推荐多个问题。问题3是一个观点,而问题4听起来像是一个独立的问题。谢谢,@Julian。让我去掉后面的两个问题,然后它实际上只是一个问题。另一个要考虑的是箭头函数的<代码>这个上下文被明确绑定到类实例,但是方法定义的<>代码>这个< /C> >上下文隐式地绑定到类实例。即
    const x=instance.Foo;x()
    将不起作用,但
    const y=instance.Baz;y()
    将始终有效。
    a:
    Baz of a
    Foo of a
    b:
    Baz of b
    Foo of b
    c:
    Baz
    Foo on prototype
    d:
    Baz
    Foo on prototype
    e:
    Baz of SubClass2
    Foo of SubClass2