这是一个简单的get
属性装饰器:
function get(target, name) {
const key = name.replace(/^_/, '');
Object.defineProperty(
target,
key,
{
get: function() {
return this[name];
}
});
}
class Foo {
@get
private _var: string;
}
const foo = new Foo();
foo.var;
但是foo.var
是undefined
而TypeScript恐慌。
我在这里做错了什么?
答案 0 :(得分:0)
获得undefined
的原因是因为您从未定义过值:
private _var: string = 'val';
此外,TypeScript不会更改Foo
类的类型以包含装饰器添加的属性,这就是为什么它告诉你“类型Foo上不存在var,你的意思是_var吗?”在这一行:
foo.var;
您可以通过接口/类声明合并解决问题:
function get(target, name) {
const key = name.replace(/^_/, '');
Object.defineProperty(
target,
key,
{
get: function() {
return this[name];
}
});
}
interface Foo { var: string;}
class Foo {
@get
private _var: string = 'val';
}
const foo = new Foo();
foo.var;
但这可能会破坏尝试减少代码的重点,并引入“如果你改变了类,你必须改变界面”的问题。
虽然我可以看到你试图通过自动属性的形式使你的代码更加简洁,但是如果没有类型支持,这个概念将无法工作,因为自动完成将被误导。
工作代码会很无聊:
class Foo {
private _var: string = 'val';
public get var() {
return _var;
}
}
const foo = new Foo();
foo.var;