Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangfisher committed Aug 21, 2024
1 parent d1555b3 commit cfea788
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 59 deletions.
2 changes: 1 addition & 1 deletion example/src/forms/network/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const NetworkForm = ()=>{
</Field>
} }
</Network.Field2>
<Network.Field2 name="wifi.cancelableSubmit">
<Network.Field2 name="wifi.password">
{({title,value,required,visible,validate,enable,placeholder,sync})=>{
console.log(required,visible,validate,enable)
return <Field visible={visible} label={title}>
Expand Down
69 changes: 40 additions & 29 deletions packages/core/src/field2.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,46 +113,37 @@ function createFieldProps(name:string,value:any,syncer:any,filedUpdater:any){
* }
*
*/
export type UnknownArray = readonly unknown[];


// 主类型,用于从数组中提取每个对象的 `value` 类型,并将其组合成一个元组类型
type PickArrayItem<T extends { value: any }[]> = {
[K in keyof T]:T[K] extends { value: infer V } ? V : never
[K in keyof T]: T[K] extends { value: infer V } ? V : never
};

type FormFieldState<Fields extends Dict> = {
[Name in keyof Fields]:
Fields[Name] extends any[]
[Name in keyof Fields
as Fields[Name] extends { execute: any } ? never : Name
]:
Fields[Name] extends readonly any[]
? PickArrayItem<Fields[Name]>
: (
Fields[Name] extends Dict ?
(Fields[Name] extends FormFieldBase<infer V> ? V : FormFieldState<Fields[Name]>)
: never
)
Fields[Name] extends Dict
? (
Fields[Name] extends FormFieldBase<infer V>
? V : FormFieldState<Fields[Name]>
)
: never
)
}

const data = {
fields:[
{value:1},
{value:true}
],
a:{value:"aaaa"}
}

// 使用 PickArrayItem 类型来自动推断 data.fields 中每个成员的 `value` 类型
type ass = PickArrayItem<typeof data.fields>;



// 生成每一个字段路径对应的声明类型,如{fields.xxx:{value,...}}
type FormFieldNames<State extends Dict> = {
[Key in keyof Record<Paths<FormFieldState<State>['fields']>,any>]: {
render?:FieldRender<GetTypeByPath<State,`fields.${Key}`>>
children?: FieldRender<GetTypeByPath<State,`fields.${Key}`>> | FieldRender<GetTypeByPath<State,`fields.${Key}`>>[];
[Key in keyof Record<Paths<FormFieldState<State['fields']>>,any>]: {
render? : FieldRender<GetTypeByPath<State,`fields.${Key}`>>
children?: FieldRender<GetTypeByPath<State,`fields.${Key}`>>
| FieldRender<GetTypeByPath<State,`fields.${Key}`>>[];
}
}



export type FieldProps3<State extends Dict> = MutableRecord<FormFieldNames<State>,'name'> & {
name: Paths<FormFieldState<State['fields']>>
}
Expand Down Expand Up @@ -190,7 +181,27 @@ export function createFieldComponent2<State extends Dict >(store: FormStore<Stat
}
},(oldProps:any, newProps:any)=>{
return oldProps.name === newProps.name
}) //as <Name extends Paths<FormFinalState<State>['fields']>>(props: FieldProps2<FormState<State>,Name>)=>ReactNode
})
}



// const f={
// fields:{
// ss1:{execute:1},
// name:{value:"zhang"},
// age:{value:18},
// wifi:{
// ssid:{value:""},
// password:{value:1},
// ss1:{execute:1},
// ss2:{execute:1}
// },
// dns:[
// {value:"192.168.1.1",a:1},
// {value:1,a:2}
// ]
// }
// }
// type Net = FormFieldState<typeof f>
// type NETL = Paths<FormFieldState<typeof f>['fields']>
// type NETL2 = FormFieldNames<FormFieldState<typeof f>,never>
37 changes: 8 additions & 29 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,33 +23,12 @@ export type FormData = Record<string, any>;
export type Primitive = number | boolean | string | null | undefined

// 指定字符串路径来提取对象类型中的类型,如GetTypeByPath<{a:{b:number}},"a.b"> == number
export type GetTypeByPath<T ,P> = P extends `${infer K}.${infer R}` ? K extends keyof T ? GetTypeByPath<T[K],R> : never : P extends keyof T ? T[P] : never
export type GetTypeByPath<T ,P extends string> = P extends `${infer K}.${infer R}`
? K extends keyof T
? GetTypeByPath<T[K],R> : never : P extends keyof T
? T[P] : any

/**
*
* 根据路径提取对象类型中的类型
*
* PickByPath<{a:boolean},"a"> == boolean
* PickByPath<{a:boolean},["a"]> == boolean
* PickByPath<{a:{b:number}},["a","b"]> == number
*
*
*/
export type PickByPath<T extends Record<string, any>, P extends string | string[]> =
P extends string
? T[P]
: P extends [infer First, ...infer Rest]
? First extends keyof T
? Rest extends []
? T[First]
: Rest extends string[]
? PickByPath<T[First], Rest>
: never
: never
: never;

// 测试用例
type Test1 = PickByPath<{a: boolean}, "a">; // boolean
type Test2 = PickByPath<{a: boolean}, ["a"]>; // boolean
type Test3 = PickByPath<{a: {b: number}}, ["a", "b"]>; // number
type Test4 = PickByPath<{a: {b: number,c:string[]}}, ["a", "c"]>; // string[]
// 移除对象中的never类型
export type RemoveNeverItem<T extends Record<string, any>> = {
[K in keyof T as T[K] extends never ? never : K]: T[K]
}

0 comments on commit cfea788

Please sign in to comment.