我有一个属性装饰器,可以在类上生成一些方法。如何输入有关这些的信息?
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:'声明'修饰符不能出现在类元素。
答案 0 :(得分:2)
您不能将declare
用于非环境定义。
然而,您可以使用mixins中使用的相同技巧:
class Foo {
@GenerateGetterAndSetter() _bar: string;
public getBar: () => string;
public setBar: (value: string) => this;
}
正如mixins docs中所写:
为了满足这一要求,我们创建了替代属性及其属性 来自我们mixins的成员的类型。这满足了 这些成员在运行时可用的编译器。
我使用了getBar
和setBar
因为您无法重复使用该方法的名称,除非您这样做:
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
。