如何申报方法?

时间:2017-01-14 11:11:42

标签: typescript

我有一个属性装饰器,可以在类上生成一些方法。如何输入有关这些的信息?

class Foo {
  @GenerateGetterAndSetter() _bar: string;
  // How to do the following:
  declare public bar(): string;
  declare public bar(value: string): this:
}

let foo = new Foo();
foo.bar();

我得到的错误是 TS1031:'声明'修饰符不能出现在类元素

1 个答案:

答案 0 :(得分:2)

您不能将declare用于非环境定义。

然而,您可以使用mixins中使用的相同技巧:

class Foo {
    @GenerateGetterAndSetter() _bar: string;

    public getBar: () => string;
    public setBar: (value: string) => this;
}

正如mixins docs中所写:

  

为了满足这一要求,我们创建了替代属性及其属性   来自我们mixins的成员的类型。这满足了   这些成员在运行时可用的编译器。

我使用了getBarsetBar因为您无法重复使用该方法的名称,除非您这样做:

class Foo {
    @GenerateGetterAndSetter() _bar: string;

    public get bar(): string {
        return null;
    }

    public set bar(value: string) {}
}

在这种情况下,你必须有虚拟实现,然后你可以用装饰器覆盖它们 但是如果你尝试了,你就不会有任何回报:

  

'set'访问器不能有返回类型注释

修改

根据您的评论,您的实施有一种方法,您将无法使用“替代属性”,因为它不允许两种不同的签名:

class Foo {
    @GenerateGetterAndSetter() _bar: string;

    public bar: () => string;
    public bar: (value: string) => this; // error: Duplicate identifier 'bar'
}

您可以使用工厂功能:

class Foo {
    @GenerateGetterAndSetter() _bar: string;
}

type FooImplementation = {
    bar(): string;
    bar(value: string): Foo;
}

function createFoo(): Foo & FooImplementation {
    return new Foo() as Foo & FooImplementation;
}

但您将无法返回this,仅返回Foo