看不到 属性 的打字稿混入

Can't see property of typescript mixins

当我使用 mixins 时,我看不到(与 code/whisper)id 的 属性。

我的代码是:

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

问题出在 console.log(i._object.id); 行上。我收到一个错误:Property 'id' does not exist on type 'typeof User'.

出了什么问题,我该如何解决?

通过将 Base 作为参数传递,您使用 typeof User(构造函数类型)作为 TBase 而不是 User([= 的类型14=] 实例)。我认为您只需要 User,通过指定通用参数:

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

Playground link

一些其他注意事项:

  • o 不需要 as any
  • 旁注:如果您只想要 User 的形状而不需要实现,请使用 interface User { id: number; } 而不是 class。那么您将不需要 @ts-ignorePlayground link.