多个通用约束,彼此依赖默认值

问题描述 投票:0回答:1

这是我的Typescript接口/类结构:

interface IBaseOptions {
    homeUrl: string;
}

abstract class BaseApp<TOptions extends IBaseOptions = IBaseOptions> {
    constructor(
        private options: TOptions
    ) {
        // does nothing
    }
}

// -----------------------------

interface ICalls {
    getValue: () => number;
}

interface IOptions<TCalls extends ICalls = ICalls> extends IBaseOptions {
    calls: TCalls;
}

class App<TOptions extends IOptions<TCalls> = IOptions<TCalls>, TCalls extends ICalls = ICalls> extends BaseApp<TOptions> {
                                   -------- (ts2744 error here)
    constructor(options: TOptions) {
        super(options);
    }
}

class SubApp extends App {
    // whatever implementation
}

我想提供默认值,以便我没有为我的选项和调用提供具体的类型。我定义类型的方式导致编译错误(ts2744错误)。

[我也想避免交换我的泛型类型(带有约束和默认值),以便我将第一个泛型类型保留为选项,然后再调用第二个泛型类型。

有没有什么办法可以先用约束定义泛型,然后再设置其默认值?

您可以检查此Playground Link

typescript default-value generic-constraints
1个回答
0
投票

很明显的解决方法,交换类型参数的顺序,对您不起作用。因此,我们不得不求助于不太明显的修复程序。这里的基本思路是:如果无法将默认值设置为所需的值,请将其设置为虚拟值,然后在使用类型时,检查虚拟值并使用您最初想要的默认值。因此Foo<T=Default<U>, U=X> ... T类似于Foo<V=DefaultSigil, U=X> ... V extends DefaultSigil ? Default<U> : V

© www.soinside.com 2019 - 2024. All rights reserved.