如何修正提取返回类型后的useStateError函数使其合法?
修复TypeScript中useStateError函数的类型问题
你遇到的问题核心是:提取的stateGetter和stateSetter是自带独立泛型的类型,它们的泛型T和useStateError函数的泛型T没有关联,导致TypeScript认为getter可以返回任意类型、setter可以接受任意类型,和实际返回的函数类型不匹配。
正确的修改方式
把类型定义改成依赖外部泛型参数的形式,让类型的泛型和函数的泛型绑定:
- 调整类型定义
// 让类型接收外部传入的泛型T,而非自身声明泛型 type StateGetter<T> = () => T; type StateSetter<T> = (state: T) => void;
- 修改函数返回值类型
function useStateFixed<T>(initState: T): [StateGetter<T>, StateSetter<T>] { let _state = initState; return [ (): T => { return _state }, (state: T) => { _state = state; } ]; }
更简洁的写法(可选)
也可以直接定义一个包含泛型的元组类型,避免拆分两个类型:
type StateTuple<T> = [() => T, (state: T) => void]; function useStateFixed<T>(initState: T): StateTuple<T> { let _state = initState; return [ (): T => { return _state }, (state: T) => { _state = state; } ]; }
这样修改后,getter和setter的类型会严格和函数初始化时的T保持一致,和原useStateCorrect的类型逻辑完全等价,TypeScript就能通过类型检查了。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

