gpt4 book ai didi

typescript - ES6 与 TypeScript 中的泛型类型混合

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:10 24 4
gpt4 key购买 nike

我正在尝试在 TypeScript 中使用 ES6 Mixin。我所拥有的如下所示,它与 BaseClass 完美配合。

class BaseClass {
public foo() {}
};

interface IMyMixin {
foo2();
}

let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin {
public foo2() {}
}

class MyBaseClass extends MyMixin(BaseClass) {

}

但是我不能在 BaseClass 的派生类上应用 MyMixin;同时,我也不能使 mixin 通用。

有没有办法让它同时适用于 BaseClassDerivedClass

class DerivedClass extends BaseClass {
public bar() {}
}

class MyDerivedClass extends MyMixin(DerivedClass) {
public something() {
// Compile Error: Property 'bar' does not exist on type 'MyDerivedClass'
this.bar();
}
}

// Compile Error: 'T' only refers to a type, but is being used as a value here.
let MyMixin = <T extends BaseClass>(superclass: typeof T) => class extends T implements IMyMixin {
public foo2() {}
}

最佳答案

我从 TypeScript/PR#13743 找到了解决方案,并根据@Maximus 的评论对其进行了优化。

这段代码有效。原因是,在 MyMixin 中,T 应该是一个 Class(即构造函数),而不是类型。

type Constructor<T> = new (...args: any[]) => T;

class BaseClass {
public foo() { }
};

interface IMyMixin {
foo2();
}

// `implements IMyMixin` is optional.
let MyMixin = <T extends Constructor<BaseClass>>(superclass: T) => class extends superclass implements IMyMixin {
public foo2() { }
}

class DerivedClass extends BaseClass {
public bar() {}
}

class MyDerivedClass extends MyMixin(DerivedClass) {
public something() {
this.bar();
this.foo();
this.foo2();
}
}

关于typescript - ES6 与 TypeScript 中的泛型类型混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43086637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com