typescript - 在 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
以查看是否发生错误
解决方案
摆弄你的代码,我通过省略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)。