Effector createStore泛型使用报错TS2345,求合理解决方案
问题解决:Effector中createEventAndStore的TypeScript类型错误
关于类型断言的可行性
用const myStore = createStore<T>({} as T)能暂时绕过类型检查,但存在明显风险:如果T包含必填字段,这个空对象初始值实际上不符合T的类型定义,后续逻辑里访问这些必填字段时会触发运行时错误。这种方式仅适合T所有字段均为可选的场景,不推荐作为通用解决方案。
更优修复方式
方式1:约束泛型范围,确保初始值安全
修改泛型约束,让T必须是{}的子类型,此时{} as T的断言是安全的(只要T的字段都是可选的):
import {createEvent, createStore} from 'effector'; export default function createEventAndStore<T extends {} = {}>() { const myEvent = createEvent<T>() const myStore = createStore<T>({} as T) myStore.on(myEvent, (_, next) => next) }
这种方式缩小了T的范围,避免T被实例化为与{}无关的类型,同时保证类型安全性。
方式2:让调用方传入初始值
如果T可能包含必填字段,最安全的做法是让使用者提供符合T类型的初始值,从根源上避免类型不匹配:
import {createEvent, createStore} from 'effector'; export default function createEventAndStore<T>(initialValue: T) { const myEvent = createEvent<T>() const myStore = createStore<T>(initialValue) myStore.on(myEvent, (_, next) => next) } // 调用示例 createEventAndStore({ name: 'test', age: 20 })
方式3:用Partial处理部分初始状态
若需要初始状态为T的部分属性,后续通过事件补全完整状态,可以调整泛型定义:
import {createEvent, createStore} from 'effector'; export default function createEventAndStore<T>() { const myEvent = createEvent<T>() const myStore = createStore<Partial<T>>({}) myStore.on(myEvent, (_, next) => next) }
这种方式明确区分了初始的部分状态和后续的完整状态,适合逐步构建数据的场景。
内容的提问来源于stack exchange,提问作者user657009
相关产品推荐
相关产品推荐

