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