封装useState钩子遇TS2322错误:Dispatch类型不兼容如何解决?
修复useState包装钩子的TypeScript类型错误
你的错误根源在于TypeScript自动将useState(undefined)的状态类型推断为undefined,而非你期望的CdvPurchase.VerifiedPurchase | undefined,导致setSubscription的类型和你声明的返回类型不兼容。
修复方案1:显式指定useState泛型类型
直接给useState指定泛型,明确状态的可选类型:
const useStateIAPSubscription = (): [ CdvPurchase.VerifiedPurchase | undefined, React.Dispatch<React.SetStateAction<CdvPurchase.VerifiedPurchase | undefined>>, ] => { const [subscription, setSubscription] = useState<CdvPurchase.VerifiedPurchase | undefined>(undefined); return [subscription, setSubscription]; }; export default useStateIAPSubscription;
修复方案2:简化返回类型(推荐)
去掉手动声明的返回类型,让TypeScript根据泛型自动推断,同时用as const锁定返回数组的类型:
const useStateIAPSubscription = () => { const [subscription, setSubscription] = useState<CdvPurchase.VerifiedPurchase | undefined>(undefined); return [subscription, setSubscription] as const; }; export default useStateIAPSubscription;
两种方案都能让setSubscription正确接受undefined或CdvPurchase.VerifiedPurchase类型的值,也支持传入接收当前状态并返回这两种类型的函数,完全满足你在订阅就绪前初始化、后续更新数据的需求。
内容的提问来源于stack exchange,提问作者Patrick Kenny
相关产品推荐
相关产品推荐

