Kan ikke se egenskapen til TypeScript-mikser


Jeg kan ikke se id til min eiendom når jeg bruker mixins (vs code/whisper).

Koden min er:

class User {
    // @ts-ignore
    id: number;
} 

function Parent<TBase>(Base: TBase) {
  return class ParentChild {  
    _object: TBase;

    constructor (o: TBase) {
        this._object = o;
    } 

    dump(): void {
        console.log(this._object);
    }
  };
}

class Test extends Parent(User) {

}

const o = {id: 2} as any;
const i = new Test(o);

// problem
console.log(i._object.id);

Problemet er på linjen console.log(i._object.id);. Jeg får en feil: Property 'id' does not exist on type 'typeof User'.

Hva er galt, og hvordan kan jeg fikse det?

Svar #1

Ved å sende Base som en parameter, bruker du typeof User (konstruktørfunksjonstypen) som TBase i stedet for User (typen til User-instanser). Jeg tror du bare vil bruke User, ved å spesifisere det generiske argumentet:

class User {
    // @ts-ignore
    id: number;
} 

function Parent<TBase>() {
//             ^^^^^^^^^
  return class ParentChild {  
    _object: TBase;

    constructor (o: TBase) {
        this._object = o;
    } 

    dump(): void {
        console.log(this._object);
    }
  };
}

class Test extends Parent<User>() {
//                 ^^^^^^^^^^^^^^

}

const o = {id: 2} as any;
const i = new Test(o);

// problem
console.log(i._object.id);

Lekerom lenke

Et par andre notater:

  • Det er ikke nødvendig med as any på o.
  • Side note: Hvis du bare vil ha strukturen til User uten implementasjon, bruk interface User { id: number; } i stedet for class. Da trenger du ikke @ts-ignore. Playground-lenke.

Relaterte artikler