需要启用experimentalDecorators
要启用对装饰器的实验性支持,您必须在命令行或tsconfig.json中启用ExperimentalDecorators编译器选项:
command Line:
tsc –target ES5 –experimentalDecorators 这个文档说的很有问题,说是要“
实验性支持”,而实际上,自ts5之后,启用这个选项实际上是“使用old style decorators/old legacy decorators”
TypeScript 5.0 添加了对 ECMAScript 装饰器的支持。它从很久以前(大约 7 年)就支持所谓的 TypeScript 装饰器。这两种类型的装饰器不兼容。编译器选项
–experimentalDecorators
触发旧式装饰器的使用,它们通常需要
–emitDecoratorMetadata
才能正常工作。首先,您必须决定要使用哪种类型的装饰器。
// 在函数调用前执行格式化操作 export const
parseDecorator = ( target: any, propertyName: string, descriptor: PropertyDescriptor, ):
PropertyDescriptor => { return { …descriptor, value(…args: any[]) { …… }, }; }; // 这里,这个方法装饰器会返回一个对象(PropertyDescriptor)而实际需要一个Function,所以就报错了
export interface UserType { id: number; username: string; }
class UserService { private users: UserType[] = [ { id: 1, username: ‘admin’ }, { id: 2, username: ‘pincman’ }, ];
@
parseDecorator delete(id: number) { …… return this; } }
编译出来
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== “function”) throw new TypeError(“Function expected“); return f; } // 这个f就是返回的PropertyDescriptor对象,可以看到typeof不能是对象,需要是函数
……
else if (_ = accept(result)) {