typescript - Typescript 可选类型推断
问题描述
不确定问题是否正确,但我希望它推断结果类型但实际上不知道如何去做。
我现在是怎么做的:
type StateSetter<S> = (prevState: S) => S;
type ResolvableHookState<S> = S | StateSetter<S>;
export function resolveHookState<S>(state: S): S;
export function resolveHookState<S>(state: StateSetter<S>, currentState?: S): S;
export function resolveHookState<S>(state: ResolvableHookState<S>, currentState?: S): S {
if (typeof state === 'function') {
return (state as StateSetter<S>)(currentState as S);
}
return state;
}
这是我想使用它的方式:
function someFunction(initialState: ResolvableHookState<number> = 0){
const resolvedState = resolveHookState(initialState);
}
想法是resolveHookState(initialState)
返回数字类型,但由于显而易见的原因它返回ResolvableHookState<number>
我试图通过推断来做到这一点,但它似乎没有像我预期的那样工作。
type ResolvableHookStateType<S extends ResolvableHookState<any>> = S extends StateSetter<infer T> ? T : S;
[UPD 1]
经过一番修修补补,结果如下:
export type StateSetter<S> = (prevState?: S) => S;
export type ResolvableHookState<S> = S | StateSetter<S>;
type ResolvableHookStateType<S> = S extends ResolvableHookState<infer T> ? T : never;
export function resolveHookState<S>(state: S): ResolvableHookStateType<S>;
export function resolveHookState<S>(state: StateSetter<S>, currentState?: S): ResolvableHookStateType<S>;
export function resolveHookState<S>(state: ResolvableHookState<S>, currentState?: S): ResolvableHookStateType<S> {
if (typeof state === 'function') {
return (state as StateSetter<S>)(currentState) as ResolvableHookStateType<S>;
}
return state as ResolvableHookStateType<S>;
但我不确定这是解决问题的最优雅的方法。
解决方案
interface Callable<ReturnType> {
(...args: any[]): ReturnType;
}
type GenericReturnType<ReturnType, F> = F extends Callable<ReturnType>
? ReturnType
: never;
function someFunction(initialState: ResolvableHookState<number> = 0){
const resolvedState = GenericReturnType<number, typeof initialState>;
}
这篇文章或许能帮到你。
推荐阅读
- sql-server - 如何使用另一个存储过程中的参数化输出执行存储过程
- oracle - Junit 的模拟数据库
- c# - C#:使用 Microsoft 求解器求解非线性系统
- angular - Angular:添加动态类
- c# - Excel VSTO 2016 - 显示 UDF 的函数参数对话框
- python - 如何在 Python 3 json 模块中关闭转义 unicode 字符的自动解析?
- sql-server - T-SQL 查询仅显示一列中的值与另一行中另一列中的值匹配的行
- java - Wildfly Eclipselink checkForUnregisteredExistingObject NullPointerException
- firebase - 当应用程序处于后台时,如何在 Xamarin 中不显示来自 Firebase 云消息传递的通知
- javascript - 如何删除 JSON 中的最后一个斜杠内容