更简便的Svelte Store类型JSDoc注释定义方法?
更简便的Svelte Store类型JSDoc注释定义方法?
我太懂这种纠结了!给Svelte的Writable Store加类型提示时,既要准确又不想写一堆冗余代码,还要避免污染实际业务逻辑,确实挺闹心的。你已经试的两种方法虽然能用,但要么写起来繁琐,要么多了没必要的代码包装,那我来分享几个更清爽的方案:
方案1:先定义类型别名,再标注Store(最推荐)
把你需要的类型抽成一个可复用的别名,再用它来标注Store,代码瞬间整洁很多:
// 先定义类型别名,后续其他地方也能复用 /** @typedef {{ nick: string; img: string } | null} UserInfo */ // 直接用别名标注Store,清晰又简洁 /** @type {import('svelte/store').Writable<UserInfo>} */ export const userInfoStore = writable(null);
这种方法既保留了第一种方案的准确性,又通过类型别名简化了重复的类型书写,而且完全不会影响运行时代码。
方案2:自定义一个带类型提示的Writable包装函数(适合多Store场景)
如果你有很多Store需要加类型提示,可以一次性定义一个包装函数,后续创建Store时直接用它,不用每次写长串的JSDoc:
/** * 带类型推导的Writable包装函数 * @template T * @param {T} initialValue * @returns {import('svelte/store').Writable<T>} */ const typedWritable = (initialValue) => writable(initialValue); // 创建Store时直接给初始值加类型即可 export const userInfoStore = typedWritable(/** @type {UserInfo} */ null); // 其他Store也能复用这个函数 export const settingsStore = typedWritable(/** @type {{ theme: 'light'|'dark' }} */ { theme: 'light' });
这个包装函数完全没有运行时开销,只是给JSDoc提供类型推导的依据,用起来非常省心。
为啥你第三种方法行不通?
你尝试直接给null加类型的写法,之所以没生效,是因为VS Code的类型检查(基于TypeScript)不会把你给初始值单独标注的类型,自动传递给writable的泛型参数。它只会从null本身推导类型,所以最终Store的类型会变成Writable<null>,而不是你想要的联合类型。
总之,上面两种方案都能解决你的痛点,既保证类型提示准确,又不会让代码变得臃肿~
备注:内容来源于stack exchange,提问作者enoeht
相关产品推荐
相关产品推荐

