diff --git a/packages/dts-test/inject.test-d.ts b/packages/dts-test/inject.test-d.ts index f0522f25451..e611f900de5 100644 --- a/packages/dts-test/inject.test-d.ts +++ b/packages/dts-test/inject.test-d.ts @@ -1,6 +1,7 @@ import { provide, inject, ref, Ref, InjectionKey } from 'vue' import { expectType } from './utils' +// non-symbol keys provide('foo', 123) provide(123, 123) @@ -9,6 +10,8 @@ const key: InjectionKey = Symbol() provide(key, 1) // @ts-expect-error provide(key, 'foo') +// @ts-expect-error +provide(key, null) expectType(inject(key)) expectType(inject(key, 1)) @@ -27,3 +30,13 @@ const injectionKeyRef = Symbol('key') as InjectionKey> // @ts-expect-error provide(injectionKeyRef, ref({})) + +// naive-ui: explicit provide type parameter +provide('cube', { size: 123 }) +provide(123, { size: 123 }) +provide(injectionKeyRef, { size: 123 }) + +// @ts-expect-error +provide('cube', { size: 'foo' }) +// @ts-expect-error +provide(123, { size: 'foo' }) diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts index 9b765914937..bbf925102d8 100644 --- a/packages/runtime-core/src/apiInject.ts +++ b/packages/runtime-core/src/apiInject.ts @@ -6,9 +6,9 @@ import { warn } from './warning' export interface InjectionKey extends Symbol {} -export function provide>( - key: T | string | number, - value: T extends InjectionKey ? V : any +export function provide | string | number>( + key: K, + value: K extends InjectionKey ? V : T ) { if (!currentInstance) { if (__DEV__) {