// Интерфейсы, которые стали классами
class BaseData {
key: number | undefined;
}
class MyData extends BaseData {
data: string | undefined;
}
// Классы
abstract class BaseClass {
abstract getData(): BaseData;
}
class MyClass1 extends BaseClass { // Много наследников: MyClass2, MyClass3...
myData: MyData;
constructor(extData: MyData) {
super();
this.myData = extData;
}
getData(): MyData {
return this.myData;
}
}
// Где-то в коде хочу получить экземпляр
const newMyClass1 = getObj('my1', {key: 1, data: 'OLOLO'});
// Фабрика
function getObj<T extends BaseData>(type: string, someData: T): BaseClass | null {
if (type === 'my1' && someData instanceof MyData) return new MyClass1(someData);
// Получение других классов
return null;
}
interface ThingIf {
key: number;
}
class Thing { }
interface FooIf extends ThingIf {
fooData: string;
}
class Foo extends Thing {
private _data: FooIf | undefined;
constructor() {
super();
}
// constructor(data: FooIf) { // не работает такой конструктор
// super();
// this._data = data;
// }
public setData(data: FooIf) {
this._data = data;
}
}
const things = new Map<string, typeof Thing>([
['foo', Foo],
// ..............
]);
const ctor = things.get('foo')!;
const fooInst = new ctor();
// fooInst.setData({key: 1, fooData: 'data'}); // не видит такого метода
const foo2 = new Foo();
foo2.setData({key: 1, fooData: 'data'}); // так работает!
..................
const c1 = React.createElement('h2', {children: 'AZAZA'});
const c2 = React.createElement('div', {children: c1});
.................
return (
<div>
{c2}
</div>
);
#опой жуй