可以推断参数的通用接口中使用的类型吗?

时间:2018-07-21 12:12:38

标签: typescript generics inference inferred-type

我有这种方法:

attachTheme<TTheme, TSelector>(config: IConfig<TTheme, TSelector>): OtherClass<TSelector> {
}

IConfig:

interface IConfig<TTheme, TSelector> {
    select(theme: TTheme): TSelector;
}

我想以这种方式使用它:

attachTheme<MyTheme>({ select: theme => ({ background: theme.scroller.background }) });

使用{ background: string; }键入返回值,但是如果我没有将TSelector指定为默认值,则会抱怨,因此如果我将{}设置为默认值,则输出的通用类型为{ {1}},即使我认为它应该推断出类型。

我已经研究了{}关键字,但无法使其正常工作,我觉得我不太了解它,无法以正确的方式使用它,我希望有人能理解比我有能力解决我的问题更好吗?关键字似乎很少,而如何使用该关键字的例子也很少。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是让编译器通过将主题指定为箭头函数参数的类型注释来推断两个参数

attachTheme({ select: (theme: MyTheme) => ({ background: theme.scroller.background }) });

如果您不想在3.1中执行此操作,我们将获得 Named type arguments & partial type argument inference

另一种解决方案是使用返回函数的函数来指定一个参数,并且借出推理来照顾另一个参数。

function attachTheme<TTheme>() {
    return function <TSelector>(config: IConfig<TTheme, TSelector>): OtherClass<TSelector> {
        return null;
    }
}

attachTheme<MyTheme>()({ select: theme => ({ background: theme.scroller.background }) });