我有一个插件架构,我可以执行此操作
const fooPlugin = () => ({ foo: 'foo' })
const barPlugin = () => ({ bar: 'bar' })
const BaseWithPlugin = Base.plugin(fooPlugin)
const baseWithPlugin = new BaseWithPlugin()
baseWithPlugin.foo // ? string
const BaseWithPlugins = Base.plugin([fooPlugin, barPlugin])
const baseWithPlugins = new BaseWithPlugins()
baseWithPlugins.foo // ? string
baseWithPlugins.bar // ? string
Run Code Online (Sandbox Code Playgroud)
但是这样做失败了
const BaseWithPlugins2 = Base.plugin(fooPlugin).plugin(barPlugin)
const baseWithPlugins2 = new BaseWithPlugins2()
baseWithPlugins2.foo // ? Property 'foo' does not exist on type 'plugin<() => { bar: string; }>.BaseWithPlugins & { bar: string; }'.
baseWithPlugins2.bar // ? string
Run Code Online (Sandbox Code Playgroud)
如果我创建另一个扩展BaseWithPlugin并具有与静态plugin方法完全相同的实现的类,则可以得到预期的结果
class Workaround extends BaseWithPlugin {
static plugin<T extends TestPlugin | TestPlugin[]>(plugin: T) {
const currentPlugins = this.plugins;
const WorkaroundWithPlugins = class extends this {
static plugins = currentPlugins.concat(plugin);
};
type Extension = ReturnTypeOf<T>;
return WorkaroundWithPlugins as typeof WorkaroundWithPlugins & Constructor<Extension>;
}
}
const BaseWithPlugins3 = Workaround.plugin(barPlugin)
const baseWithPlugins3 = new BaseWithPlugins3()
baseWithPlugins3.foo // ? string
baseWithPlugins3.bar // ? string
Run Code Online (Sandbox Code Playgroud)
我希望找到一种不需要该解决方法的方法。这看起来像是microsoft / TypeScript#5863中报告的错误。该线程中提到了一些变通办法,但是我认为它们都不适用于我的情况。
这是带有完整代码的Playground。我还创建了一个包含2个失败的测试案例的存储库,以重现该问题。我无法弄清楚如何进行链接.plugin().plugin()或.plugin().defaults()工作,或者今天的TypeScript是否完全可行。我将非常感谢您的帮助!
这是带有解决方案的游乐场。
class Base {
static plugin<S extends Constructor<any> & { plugins: any[] }, T extends TestPlugin | TestPlugin[]>(this: S, plugin: T) {
const currentPlugins = this.plugins;
const BaseWithPlugins = class extends this {
static plugins = currentPlugins.concat(plugin);
};
type Extension = ReturnTypeOf<T>;
return BaseWithPlugins as typeof BaseWithPlugins & Constructor<Extension>;
}
}
Run Code Online (Sandbox Code Playgroud)
您缺少的部分是您应该让plugin静态函数还推断的类型this。
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |