Как создать дочерний класс в TypeScript, используя родительский статический метод? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два класса: модель и пользователь.Пользователь расширяет модель.

export Model {
  id: number;
  static fromData<T>(data: any): T {
    return Object.assign(new Model(), data);
  }
}

export User extends Model {
  name: string;
  sayHi(): string {
    return 'Hi, ' + this.name;
  }
}

Способ, которым я хотел использовать, выглядит следующим образом:

const currentUser = User.fromData(dataFromServer);
const message = currentUser.sayHi();

Метод hi () не работает, потому что я создал экземпляр Modelучебный класс.

Как использовать дженерики TypeScript для получения экземпляра производного класса с использованием статического метода базового класса?

Я планирую количество различных сущностей с общими.

Я видел этот ответ , но я не знаю, как передать параметры в статический метод в моем случае.

1 Ответ

0 голосов
/ 15 мая 2018

Поскольку статический метод находится в самом классе, мы имеем доступ к конструктору класса, используя this внутри статического метода, this является классом iself.Если мы ограничим параметр this статическим методом в качестве конструктора, возвращающего T (this: new ()=> T), мы получим правильную типизацию возвращаемого значения.Параметр this только для удобства компилятора машинописного текста, он фактически не будет передаваться в JS, и вам не нужно явно передавать его:

export class Model {
    id: number;
    static fromData<T>(this: new () => T, data: any): T {
        return Object.assign(new this(), data);
    }
}

export class User extends Model {
    name: string;
    sayHi(): string {
        return 'Hi, ' + this.name;
    }
}

const currentUser = User.fromData({ id: 10, name: ""});
const message = currentUser.sayHi();

Playground link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...