designmönster - Hur skapar man en subklass i TypeScript med hjälp av förälderns statiska metod?


Jag har två klasser: Model och User. User utökar Model.

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

Sättet jag ville använda det ser ut så här:

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

Metoden hi() fungerar inte eftersom jag har skapat en instans av Model-klassen.

Hur man använder TypeScript-generics för att få en instans av en härledd klass med hjälp av basklassens statiska metod?

Jag planerar ett antal olika enheter med gemensamt.

Jag såg detta svar men jag vet inte hur jag ska skicka parametrar till en statisk metod i mitt fall.

Svar #1

Eftersom den statiska metoden finns på själva klassen har vi tillgång till klasskonstruktören med hjälp av this inuti den statiska metoden, this är själva klassen. Om vi begränsar this-parametern för den statiska metoden till att vara en konstruktör som returnerar T (this: new()=> T) får vi korrekt typning för returvärdet. this-parametern är bara till för typescript-kompilatorn, den kommer faktiskt inte att genereras till JS och du behöver inte passera den explicit:

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

Lekplatslänk

Relaterade artiklar