diff --git a/packages/dts-test/inject.test-d.ts b/packages/dts-test/inject.test-d.ts index c34485a61..f0522f254 100644 --- a/packages/dts-test/inject.test-d.ts +++ b/packages/dts-test/inject.test-d.ts @@ -1,6 +1,9 @@ -import { provide, inject, InjectionKey } from 'vue' +import { provide, inject, ref, Ref, InjectionKey } from 'vue' import { expectType } from './utils' +provide('foo', 123) +provide(123, 123) + const key: InjectionKey = Symbol() provide(key, 1) @@ -14,3 +17,13 @@ expectType(inject(key, () => 1, true /* treatDefaultAsFactory */)) expectType<() => number>(inject('foo', () => 1)) expectType<() => number>(inject('foo', () => 1, false)) expectType(inject('foo', () => 1, true)) + +// #8201 +type Cube = { + size: number +} + +const injectionKeyRef = Symbol('key') as InjectionKey> + +// @ts-expect-error +provide(injectionKeyRef, ref({})) diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts index 4559c1b70..9b7659149 100644 --- a/packages/runtime-core/src/apiInject.ts +++ b/packages/runtime-core/src/apiInject.ts @@ -6,7 +6,10 @@ import { warn } from './warning' export interface InjectionKey extends Symbol {} -export function provide(key: InjectionKey | string | number, value: T) { +export function provide>( + key: T | string | number, + value: T extends InjectionKey ? V : any +) { if (!currentInstance) { if (__DEV__) { warn(`provide() can only be used inside setup().`)