如何解决打字稿:如何在实例成员属性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 举报,一经查实,本站将立刻删除。