根据返回值推断出打字稿功能的返回类型

时间:2020-05-14 07:43:33

标签: typescript

考虑以下示例:

type State = { sth: Something };
type Selector = <T>(state: State) => T;
const selector: Selector = state => state.sth;

我希望从返回的值中自动推断selector函数的返回类型,并且还能够访问其属性,但是出现此错误:

Type 'Something' is not assignable to Type 'T'

是否可以在不显式指定返回类型的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

Selector是一个通用函数,因此它的任何实现都应该是一个通用函数。

您可能希望Selector是泛型,而恰好是一个函数:

type Selector<T> = (state: State) => T;

这将使您编写如下内容:

const selector: Selector<Something> = state => state.sth;

这仍然没有您想要的确切行为,因为您需要明确说明变量的类型。

Typescript没有用于部分变量类型推断的语法(类似const selector: Selector<?>之类的东西)。变量类型推断是一事无成,要么获得初始化表达式的类型,要么对类型完全清楚。

我恳请您考虑是否真的需要显式注释。如果让TS在(selector这样的表达式中推断const selector = (state: State) => state.sth,它将为(state: State) => Something,它将与Selector<Something>兼容(基本相同)。因此,如果要在预期selector的地方使用Selector<Something>,则在函数未返回Something

的情况下会出现错误。

如果要为Selector<Something>推断selector,我们唯一可以推断的媒介就是一个函数,那么您可以定义一个通用函数来推断适当的T

type Something  =  { s: string}
type State = { sth: Something };
type Selector<T> = (state: State) => T;
function createSelector<T>(fn: Selector<T>) {
    return fn
}
const selector = createSelector(state => state.sth);

Playground Link