【问题标题】:What is wrong with Inheritance in Typescript?Typescript 中的继承有什么问题?
【发布时间】:2020-06-29 16:27:34
【问题描述】:

Typescript 中的继承有什么问题?

我创建了这个类:

export class ExtendedService<T extends ExtendedEntity> {
    protected repository: Repository<T>;

    constructor(
        repository?: Repository<T>
    ){
        this.repository = repository;
    }

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

并在这个类中扩展这个类:

@Injectable()
export class UserService extends ExtendedService<UserEntity> {

    constructor(
        protected readonly repository: Repository<UserEntity>
    ){
        super();
    }

    public async register(data: DeepPartial<UserEntity>): Promise<UserEntity> {
        const user = new UserEntity();
        user.createdAt = new Date();
        user.firstName = data.firstName;
        user.lastName = data.lastName;
        user.email = data.email;
        user.role = UserRole.USER;
        user.isDeleted = false;
        
        const salt = await genSalt(10);
        user.password = await hash(data.password, salt);

        return await this.create(user);
    }
}

但是在启动这个功能之后,我的控制台会抛出这个:

[Nest] 19980   - 2020-06-29 17:30:56   [ExceptionsHandler] Cannot read property 'create' of undefined +1378ms
TypeError: Cannot read property 'create' of undefined
    at Repository.create (C:\Users\Piotruś\Desktop\auth\node_modules\typeorm\repository\Repository.js:49:29)
    at UserService.create (C:\Users\Piotruś\Desktop\auth\dist\helpers\service\extended-service.js:27:40)
    at UserService.register (C:\Users\Piotruś\Desktop\auth\dist\user\user.service.js:34:27)
    at async UserController.register (C:\Users\Piotruś\Desktop\auth\dist\user\user.controller.js:25:9)
    at async C:\Users\Piotruś\Desktop\auth\node_modules\@nestjs\core\router\router-execution-context.js:46:28
    at async C:\Users\Piotruś\Desktop\auth\node_modules\@nestjs\core\router\router-proxy.js:9:17

所以,问题在于 ts 继承, 谁能告诉我我的继承有什么问题?

【问题讨论】:

  • 您看错了create 电话。 const entity: T = this.repository.create(data); 是问题所在。 this.repositoryundefined
  • @zzzzBov:那么,您能说明一下代码中要更改的内容吗?
  • 错误在Repository,但你没有显示它的代码。与继承无关...
  • Repositorytypeorm
  • 它在没有继承的情况下工作吗?

标签: javascript node.js typescript oop nestjs


【解决方案1】:

您没有将repository 参数传递给您的基类。在构造函数中调用 super() 时必须提供所有基类参数。

@Injectable()
export class UserService extends ExtendedService<UserEntity> {

    constructor(
        protected readonly repository: Repository<UserEntity>
    ){
        super(repository);
    }
...
}

正如你在这个recreation 中看到的那样,强制基类存储库参数会导致 Typescript 抛出编译错误:

预期 1 个参数,但得到 0 个。

除非必要,否则我建议您避免将参数设为可选,如果这样做,请采取预防措施以进行必要的空值检查。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 2020-04-07
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多