#typescript-generics
#typescript-дженерики
Вопрос:
Не могли бы вы помочь мне создать класс ‘MyClass’, класс M должен быть новым и реализовать IMyInterface
export interface IMyInterface<A>
{
SomeData : A;
}
export class MyClass<T,M inherits IMyInterface<T> and new() >
{
list = new Array<M>();
privete Creator()
{
const obj = new M();
obj.SameData = 'Hello data';
list.push( obj );
}
}
Ответ №1:
Думаю, вы ищете что-то подобное…
export interface IMyInterface<A> {
SomeData: A;
}
export class MyClass<T, M extends IMyInterface<T>> {
private list: M[] = [];
constructor(private constructorFunction: {new(): M; }) {
}
public add(item: T): void {
const obj = new this.constructorFunction();
obj.SomeData = item;
this.list.push(obj);
}
}
export class MyItem implements IMyInterface<string> {
public SomeData: string = '';
}
const collection = new MyClass<string, MyItem>(MyItem);
collection.add('Hello data');
Я изменил ваш псевдокод, чтобы он действительно компилировался и делал то, к чему, я думаю, вы стремились в вопросе. Важно отметить, что типы в TypeScript не имеют представления во время выполнения, поэтому вы не можете сделать new T()
. Вместо этого вам нужно передать функцию конструктора для вашего класса, которая имеет тип { new(): M; }
. Затем вы можете выполнить new X()
с этим значением, чтобы получить объект, который расширяет ваш интерфейс.