考虑以下示例:
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'
是否可以在不显式指定返回类型的情况下执行此操作?
答案 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);