首页 > 解决方案 > 在 Typescript 中调用超级构造函数后无法从子类实例访问属性

问题描述

我想知道如何在 Typescript 中实现继承。我制作了一个这样的基类模型:

export class Model {

  [key: string]: any;

  public errors?: {
    [key in keyof Model]: string;
  };

  constructor(model?: { [key in keyof Model]: Model[key] }) {
    if (model) {
      Object.assign<Model, Model>(this, model);
    }
  }
}

然后我写一个这样的测试文件:

import {Model} from './Model';

describe('Model', () => {
  class ChildModel extends Model {
    public name: string;
  }

  it('create model from object', () => {
    const name: string = 'Test Model';
    const childModel: ChildModel = new ChildModel({
      name,
    });
    expect(childModel.name).toEqual(name);
  });
});

我尝试在基类构造函数范围内进行调试,输入模型属性完全映射到类实例中。但是,子类实例不能访问映射的属性。我在谷歌上搜索过很多次。文章都说super调用必须放在子类构造函数的第一行。即使我尝试使用第一行超级调用为子类创建默认构造函数,测试仍然失败。我做错了吗?

我还尝试运行代码和代码沙箱。有用。请克隆此存储库,然后运行yarn test以查看是否发生错误

标签: typescriptinheritancesuper

解决方案


摆弄你的代码,我通过省略name派生类中的属性来让它工作。

describe('Model', () => {
  class ChildModel extends Model { }

  it('create model from object', () => {
    const name: string = 'Test Model';
    const childModel: ChildModel = new ChildModel({
      name,
    });
    expect(childModel.name).toEqual(name);
  });
});

这主要是由于在codesandbox(ES6)中设置的不同编译目标中对象构造函数初始化顺序的差异,在你的情况下,我想是react-scripts(ES5)。

您可以在这个stackoverflow 线程和这个GitHub 问题中进一步阅读。


推荐阅读