在 Typescript 中调用超级构造函数后无法从子 class 实例访问 属性

Can not access property from child class instance after calling super constructor in Typescript

我想知道如何在Typescript中实现继承。 我制作了一个基础 class 模型,如下所示:

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);
  });
});

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

我也试过运行代码和代码沙盒。有用。 请克隆此存储库然后 运行 yarn test 以查看发生的错误

Fiddle 在您的代码周围,我通过在派生的 class.

中省略 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)。

您可以在 Whosebug thread and also this GitHub 问题中进一步阅读。