typescript 如何通过TypeScript中的装饰器更改实例属性:http://romkevandermeulen.nl/2018/01/24/typescript-property-deco

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typescript 如何通过TypeScript中的装饰器更改实例属性:http://romkevandermeulen.nl/2018/01/24/typescript-property-deco相关的知识,希望对你有一定的参考价值。

function makePropertyMapper<T>(prototype: any, key: string, mapper: (value: any) => T) {
	const values = new Map<any, T>();
	Object.defineProperty(prototype, key, {
		set(firstValue: any) {
			Object.defineProperty(this, key, {
				get() {
					return values.get(this);
				},
				set(value: any) {
					values.set(this, mapper(value));
				},
				enumerable: true,
			});
			this[key] = firstValue;
		},
		enumerable: true,
		configurable: true,
	});
}

function exampleDecorator(multiplier: number) {
	return function(target: any, key: string) {
		makePropertyMapper(target, key, (value: number) => {
			return value * multiplier;
		});
	};
}

class Example {
	@exampleDecorator(3)
	myNumber: number;

	@exampleDecorator(3)
	withInitializer = 2;
}

const example = new Example();
console.log(example.myNumber); // undefined
console.log(Object.keys(example).includes("myNumber")); // false
console.log(example.withInitializer); // 6
console.log(Object.keys(example).includes("withInitializer")); // true

example.myNumber = 3;
console.log(example.myNumber); // 9
console.log(Object.keys(example).includes("myNumber")); // true

以上是关于typescript 如何通过TypeScript中的装饰器更改实例属性:http://romkevandermeulen.nl/2018/01/24/typescript-property-deco的主要内容,如果未能解决你的问题,请参考以下文章

如何通过npm编译Typescript代码

如何通过 javascript/typescript 获取“事件”对象的特定元素

如何通过 TypeScript 中的映射类型删除属性

通过 Typescript 和 HTML 选择选项后,如何禁用整个选择下拉字段?

如何通过数据库在 TypeScript 类中定义属性?

Typescript - 如何访问通过命名空间声明的类?