微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打字稿:如何在实例成员属性mixin中使用方法装饰器?

如何解决打字稿:如何在实例成员属性mixin中使用方法装饰器?

背景

我们已经实现了这样的 mixin(简化):

export type Constructor<I> = new (...args: any[]) => I;

export interface IBaseService<T = any> {
  create: (data: any) => Promise<T>;
}

export function BaseService<T>(entity: Constructor<T>): Type<IBaseService<T>> {
  class BaseServiceHost implements IBaseService<T> {
    public repository: Repository<T>;

    create(data: DeepPartial<T>): Promise<T> {
      const newResource = this.repository.create(data);
      return this.repository.save(newResource);
    }

  }
  return BaseServiceHost;
}

现在我的服务扩展 BaseService 如下:

@Injectable()
export class ResponseService extends BaseService(ResponseEntity) {
  private readonly respondentService: RespondentService;
  private readonly surveyService: SurveyService;

  create = async (data: ResponseInput): Promise<ResponseEntity> => {
    const respondent = await this.respondentService.findByNaturalKey(data.respondentKey);
    const survey = await this.surveyService.findById(data.surveyId);
    return super.create({ respondent,survey,...data })
  };

...这很好用。

PS.: create 现在必须是一个属性,否则我会收到以下错误

Class 'IBaseTenantService<ResponseEntity>' defines instance member property 'create',but extended class 'ResponseService' defines it as instance member function.

问题

create 方法(现在是一个属性),需要方法装饰器 Transactional(), 但施工

  @Transactional()  // <--- error here
  create = async (data: ResponseInput): Promise<ResponseEntity> => {
    const respondent = await this.respondentService.findByNaturalKey(data.respondentKey);
    const survey = await this.surveyService.findById(data.surveyId);
    return super.create({ respondent,...data })
  };

给出以下错误

The return type of a property decorator function must be either 'void' or 'any'.
  Unable to resolve signature of property decorator when called as an expression.

问题

如何使用 Transactional() 属性中的 create解决方法

解决方法

这听起来可能很愚蠢,但你曾经尝试过:

  @Transactional()
  async create(data: ResponseInput): Promise<ResponseEntity> {
    const respondent = await this.respondentService.findByNaturalKey(data.respondentKey);
    const survey = await this.surveyService.findById(data.surveyId);
    return super.create({ respondent,survey,...data })
  };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。