javascript - Vanilla JS 中的 Typescript 属性装饰器?
问题描述
我发现了一些使用装饰器作为类中的实例变量的代码......
我试图用纯 Javascript 复制它,但它不起作用。
这是打字稿:
export function ObservableProperty() {
return (obj: Observable, key: string) => {
let storedValue = obj[key];
Object.defineProperty(obj, key, {
get: function () {
return storedValue;
},
set: function (value) {
if (storedValue === value) {
return;
}
storedValue = value;
this.notify({
eventName: Observable.propertyChangeEvent,
propertyName: key,
object: this,
value
});
},
enumerable: true,
configurable: true
});
};
}
然后,在课堂上:
export class MyClass extends Observable {
@ObservableProperty() public theBoolValue: boolean;
…
我尝试了各种方法来实例化我的 JS 变量——总是出错……</p>
喜欢:
@ObservableProperty
this.theBoolValue = false;
这甚至可能吗?
解决方案
装饰器是 TypeScript 的东西,而不是 JavaScript 的东西(还)
查看TypeScript Docs,您可以采用他们的示例(甚至您的示例),并将其扔到他们的 Playground 中以获得 JavaScript 等价物。
例如,这是 TypeScript 示例:
function first() {
console.log("first(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("first(): called");
};
}
function second() {
console.log("second(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("second(): called");
};
}
class ExampleClass {
@first()
@second()
method() {}
}
这在 JavaScript 中归结为:
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
function first() {
console.log("first(): factory evaluated");
return function (target, propertyKey, descriptor) {
console.log("first(): called");
};
}
function second() {
console.log("second(): factory evaluated");
return function (target, propertyKey, descriptor) {
console.log("second(): called");
};
}
class ExampleClass {
method() { }
}
__decorate([
first(),
second(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], ExampleClass.prototype, "method", null);
推荐阅读
- azure - Azure 通知中心 | HubClient.SendTemplateNotificationAsync() --> 结果:空
- javascript - React Hooks - 0 vs. 空数组作为 useEffect 中的第二个参数
- antd - 自定义组件中的必填字段在填写时显示为必填
- scala - 如何为 Scala 配置调试器
- api - 允许 Gitlab 集成的安全 Kubernetes API
- r - R中光栅包的默认调色板是什么?
- php - 从 bindParam 增加值
- javascript - 如何在 JavaScript 中获取单词或字符串的最后一个字母?
- c++ - 为什么擦除方法会影响结束方法?
- concatenation - 在 VHDL 中连接位向量和十六进制