使用 InjectionKey 可解决 inject 字符串 key 导致的类型丢失问题,使 theme 类型精确为 Ref<Theme> | undefined,支持编辑器提示与类型校验;配合默认值可消除 undefined,封装为 useTheme Hook 后能复用类型安全逻辑。

因为直接用字符串 key 调用 inject 时,TypeScript 无法推断返回值类型,会默认为 unknown,编辑器自然不提示属性或方法。
字符串 key 导致类型丢失
Vue 的 inject('theme') 在 TypeScript 中没有上下文关联,编译器不知道这个字符串对应什么结构。它既不能自动补全 theme.mode,也无法检查 theme.primaryColor 是否存在——本质是“无类型注入”。
- TS 把所有未标注的字符串 key 注入结果视为
unknown,这是严格模式下的保护机制 - 即使你传的是
ref<Theme>,inject('theme')返回的仍是unknown,不是Ref<Theme> - 强行访问属性(如
theme.mode)会报错:Object is of type 'unknown'
用 InjectionKey 替代字符串
InjectionKey 是一个带泛型的 Symbol 类型,它把 token 和类型绑定在一起,让 provide/inject 全链路可推导。
- 在统一文件(如
src/injectKeys.ts)中定义:
- 提供时用这个 key:
- 注入时也用它:
此时 theme 的类型就是 Ref<Theme> | undefined,编辑器能精准提示 .value.mode,也能校验赋值是否合法。
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
配合默认值避免 undefined 检查
注入时加默认值,既能防止运行时 undefined,又能让 TS 推导出非可选类型:
- 提供默认值(非工厂):
- 此时
theme类型为Ref<Theme>(非| undefined),无需每次判空 - 若默认值是函数(如
() => ({ mode: 'light' })),需加第三个参数true显式声明为工厂
组合式函数中复用 InjectionKey
把依赖注入逻辑封装进自定义 Hook,用同一份 Key 保持类型一致性:
- 定义
useTheme():
const theme = inject(THEME_KEY)
if (!theme) throw new Error('Theme not provided')
return theme
}
调用方直接解构,类型、提示、校验全部保留:
const { value: { mode } } = useTheme()

















