Typescript之获取函数返回值类型 | 您所在的位置:网站首页 › jquery返回值是一个 › Typescript之获取函数返回值类型 |
前言 目前TS官方API还不支持获取函数返回值类型,但是对于函数式编程流行的当今,这个功能非常的重要,比如我们希望能在使用redux-thunk中getState或者mapStateToProps中state时IDE提示state类型,这时就需要获取reducer函数的返回值类型,并且进行联合导出供我们使用。 前置知识高级类型泛型、泛型约束类型推论 类型断言以上几点都能在TS文档中找到非常清晰简洁的解释和例子,这里就不花篇幅解释了。 核心代码// 声明一个泛型类型别名,返回值与泛型类型相同,入参类型不限制。 type Reverse = (arg: any) => T; // 声明一个泛型方法,入参arg继承泛型约束,返回空对象并断言其类型为T function returnResultType(arg: Reverse): T { return {} as T; } // 调用returnResultType,传入方法 (arg: any) => 3,获得result返回值 const result = returnResultType((arg: any) => 3); // 获取result类型并重名为ResultType type ResultType = typeof result; 代码分析returnResultType((arg:any)=>3);调用returnResultType时,由于没有显示声明泛型类型,所以TS只能通过入参来进行类型推论,接着往下面走: type Reverse = (arg: any) => T;由于入参的类型为Reverse ,通过入参返回值是3可以推断出: type Reverse = (arg: any) => number;由于Reverse的T是根据returnResultType传入的,所以同理得出: function returnResultType(arg: Reverse): number { return {} as number; }由于返回值已经进行类型断言为number。所以在typeof result时,可以得出number类型。 该方法确实比较绕,因为存在多个泛型T的来回推论和反推论。 ~~~ 结合Redux应用接下来我们通过reducer函数来应用一下: 1.首先编写两个简单的reducer:userReducer和loginReducer /** * userReducer */ const initUserState = { name: '' } const userReducer = (state = initUserState, action: any) => { switch (action.type) { case 'setName': return { name: 'Larry', ...state }; default: return state; } } /** * loginReducer */ const initLoginState = { token: '' } const loginReducer = (state = initLoginState, action: any) => { switch (action.type) { case 'login': return { token: 'token', ...state }; default: return state; } }2.在store中 const reducers = combineReducers({ userReducer, loginReducer }); type Reverse = (state: any, action:any) => T; function returnResultType(arg: Reverse): T { return {} as T; } const GlobalState = returnResultType(reducers); type GlobalStateType = typeof GlobalState;此时的 GlobalStateType 就是我们需要的所有reducer函数返回的对象类型。 最后,导出 GlobalStateType,在我们mapStateToProps中使用时就能轻松得到类型: 逃~~~ |
CopyRight 2018-2019 实验室设备网 版权所有 |