From f1d1f2c663637f86f23d873997bdaee93e725945 Mon Sep 17 00:00:00 2001 From: zhangyu96 Date: Tue, 23 Nov 2021 11:47:30 +0800 Subject: [PATCH 1/3] fix(types): propType type infer --- packages/runtime-core/src/componentProps.ts | 5 +++-- packages/shared/src/index.ts | 2 ++ test-dts/component.test-d.ts | 8 ++++++-- test-dts/index.d.ts | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 924f40a7384..2e45258a6dd 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -21,7 +21,8 @@ import { EMPTY_ARR, def, extend, - isOn + isOn, + IfAny } from '@vue/shared' import { warn } from './warning' import { @@ -115,7 +116,7 @@ type InferPropType = [T] extends [null] : InferPropType : [T] extends [Prop] ? unknown extends V - ? D + ? IfAny : V : T diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 97750a81cd9..ad5241c23ec 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -166,3 +166,5 @@ export const getGlobalThis = (): any => { : {}) ) } + +export type IfAny = 0 extends (1 & T) ? Y : N diff --git a/test-dts/component.test-d.ts b/test-dts/component.test-d.ts index 93c3ea4109c..d8d3934b964 100644 --- a/test-dts/component.test-d.ts +++ b/test-dts/component.test-d.ts @@ -10,7 +10,8 @@ import { ShallowUnwrapRef, FunctionalComponent, ComponentPublicInstance, - toRefs + toRefs, + IsAny } from './index' declare function extractComponentOptions( @@ -62,6 +63,7 @@ describe('object props', () => { ffff: Ref<(a: number, b: string) => { a: boolean }> validated: Ref object: Ref + zzz: any } describe('defineComponent', () => { @@ -130,7 +132,8 @@ describe('object props', () => { // validator requires explicit annotation validator: (val: unknown) => val !== '' }, - object: Object as PropType + object: Object as PropType, + zzz: Object as PropType }, setup(props) { const refs = toRefs(props) @@ -152,6 +155,7 @@ describe('object props', () => { expectType(refs.ffff) expectType(refs.validated) expectType(refs.object) + expectType>(true) return { setupA: 1, diff --git a/test-dts/index.d.ts b/test-dts/index.d.ts index 3d8d288fa6d..c225b0e4f6e 100644 --- a/test-dts/index.d.ts +++ b/test-dts/index.d.ts @@ -2,6 +2,7 @@ // use \@ts-expect-error where errors are expected. export * from '@vue/runtime-dom' +import { IfAny } from '@vue/shared' export function describe(_name: string, _fn: () => void): void @@ -14,3 +15,5 @@ export type IsUnion = (T extends any : never) extends false ? false : true + +export type IsAny = IfAny From 17fcb343532a03e3f7e48c5e09259b54e69fc9da Mon Sep 17 00:00:00 2001 From: zhangyu96 Date: Tue, 23 Nov 2021 13:17:16 +0800 Subject: [PATCH 2/3] update --- packages/runtime-core/src/componentProps.ts | 4 ++-- packages/runtime-core/src/helpers/typeUtils.ts | 2 ++ packages/shared/src/index.ts | 2 -- test-dts/index.d.ts | 4 +--- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 2e45258a6dd..c999492225c 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -21,8 +21,7 @@ import { EMPTY_ARR, def, extend, - isOn, - IfAny + isOn } from '@vue/shared' import { warn } from './warning' import { @@ -40,6 +39,7 @@ import { createPropsDefaultThis } from './compat/props' import { isCompatEnabled, softAssertCompatEnabled } from './compat/compatConfig' import { DeprecationTypes } from './compat/compatConfig' import { shouldSkipAttr } from './compat/attrsFallthrough' +import { IfAny } from './helpers/typeUtils' export type ComponentPropsOptions

= | ComponentObjectPropsOptions

diff --git a/packages/runtime-core/src/helpers/typeUtils.ts b/packages/runtime-core/src/helpers/typeUtils.ts index 204543e6de2..8caba54c6ca 100644 --- a/packages/runtime-core/src/helpers/typeUtils.ts +++ b/packages/runtime-core/src/helpers/typeUtils.ts @@ -6,3 +6,5 @@ export type UnionToIntersection = ( // make keys required but keep undefined values export type LooseRequired = { [P in string & keyof T]: T[P] } + +export type IfAny = 0 extends (1 & T) ? Y : N diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index ad5241c23ec..97750a81cd9 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -166,5 +166,3 @@ export const getGlobalThis = (): any => { : {}) ) } - -export type IfAny = 0 extends (1 & T) ? Y : N diff --git a/test-dts/index.d.ts b/test-dts/index.d.ts index c225b0e4f6e..1f0de82f45a 100644 --- a/test-dts/index.d.ts +++ b/test-dts/index.d.ts @@ -2,7 +2,6 @@ // use \@ts-expect-error where errors are expected. export * from '@vue/runtime-dom' -import { IfAny } from '@vue/shared' export function describe(_name: string, _fn: () => void): void @@ -15,5 +14,4 @@ export type IsUnion = (T extends any : never) extends false ? false : true - -export type IsAny = IfAny +export type IsAny = 0 extends (1 & T) ? true : false From 104dd08b215e1f00598f092cd8e0d766a59c6fb0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 25 Nov 2021 04:44:48 -0500 Subject: [PATCH 3/3] Update index.d.ts --- test-dts/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test-dts/index.d.ts b/test-dts/index.d.ts index 1f0de82f45a..59eadcb92d9 100644 --- a/test-dts/index.d.ts +++ b/test-dts/index.d.ts @@ -14,4 +14,5 @@ export type IsUnion = (T extends any : never) extends false ? false : true + export type IsAny = 0 extends (1 & T) ? true : false