mirror of
https://github.com/element-plus/element-plus.git
synced 2026-03-13 07:51:17 +08:00
chore(hooks): [useLocale] autocomplete locale field keys (#21876)
This commit is contained in:
@@ -5,7 +5,7 @@ import type {
|
||||
ValidateFieldsError,
|
||||
} from 'async-validator'
|
||||
import type { ComponentSize } from '@element-plus/constants'
|
||||
import type { Arrayable } from '@element-plus/utils'
|
||||
import type { Arrayable, FieldPath } from '@element-plus/utils'
|
||||
import type { MaybeRef } from '@vueuse/core'
|
||||
import type {
|
||||
FormItemProp,
|
||||
@@ -20,76 +20,6 @@ export interface FormItemRule extends RuleItem {
|
||||
trigger?: Arrayable<string>
|
||||
}
|
||||
|
||||
type Primitive = null | undefined | string | number | boolean | symbol | bigint
|
||||
type BrowserNativeObject = Date | FileList | File | Blob | RegExp
|
||||
/**
|
||||
* Check whether it is tuple
|
||||
*
|
||||
* 检查是否为元组
|
||||
*
|
||||
* @example
|
||||
* IsTuple<[1, 2, 3]> => true
|
||||
* IsTuple<Array[number]> => false
|
||||
*/
|
||||
type IsTuple<T extends ReadonlyArray<any>> = number extends T['length']
|
||||
? false
|
||||
: true
|
||||
/**
|
||||
* Array method key
|
||||
*
|
||||
* 数组方法键
|
||||
*/
|
||||
type ArrayMethodKey = keyof any[]
|
||||
/**
|
||||
* Tuple index key
|
||||
*
|
||||
* 元组下标键
|
||||
*
|
||||
* @example
|
||||
* TupleKey<[1, 2, 3]> => '0' | '1' | '2'
|
||||
*/
|
||||
type TupleKey<T extends ReadonlyArray<any>> = Exclude<keyof T, ArrayMethodKey>
|
||||
/**
|
||||
* Array index key
|
||||
*
|
||||
* 数组下标键
|
||||
*/
|
||||
type ArrayKey = number
|
||||
/**
|
||||
* Helper type for recursively constructing paths through a type
|
||||
*
|
||||
* 用于通过一个类型递归构建路径的辅助类型
|
||||
*/
|
||||
type PathImpl<K extends string | number, V> = V extends
|
||||
| Primitive
|
||||
| BrowserNativeObject
|
||||
? `${K}`
|
||||
: `${K}` | `${K}.${Path<V>}`
|
||||
/**
|
||||
* Type which collects all paths through a type
|
||||
*
|
||||
* 通过一个类型收集所有路径的类型
|
||||
*
|
||||
* @see {@link FieldPath}
|
||||
*/
|
||||
type Path<T> = T extends ReadonlyArray<infer V>
|
||||
? IsTuple<T> extends true
|
||||
? {
|
||||
[K in TupleKey<T>]-?: PathImpl<Exclude<K, symbol>, T[K]>
|
||||
}[TupleKey<T>] // tuple
|
||||
: PathImpl<ArrayKey, V> // array
|
||||
: {
|
||||
[K in keyof T]-?: PathImpl<Exclude<K, symbol>, T[K]>
|
||||
}[keyof T] // object
|
||||
/**
|
||||
* Type which collects all paths through a type
|
||||
*
|
||||
* 通过一个类型收集所有路径的类型
|
||||
*
|
||||
* @example
|
||||
* FieldPath<{ 1: number; a: number; b: string; c: { d: number; e: string }; f: [{ value: string }]; g: { value: string }[]; h: Date; i: FileList; j: File; k: Blob; l: RegExp }> => '1' | 'a' | 'b' | 'c' | 'f' | 'g' | 'c.d' | 'c.e' | 'f.0' | 'f.0.value' | 'g.number' | 'g.number.value' | 'h' | 'i' | 'j' | 'k' | 'l'
|
||||
*/
|
||||
type FieldPath<T> = T extends object ? Path<T> : never
|
||||
export type FormRules<
|
||||
T extends MaybeRef<Record<string, any> | string> = string
|
||||
> = Partial<
|
||||
|
||||
@@ -4,10 +4,15 @@ import English from '@element-plus/locale/lang/en'
|
||||
|
||||
import type { MaybeRef } from '@vueuse/core'
|
||||
import type { InjectionKey, Ref } from 'vue'
|
||||
import type { FieldPath } from '@element-plus/utils'
|
||||
import type { Language } from '@element-plus/locale'
|
||||
|
||||
export type LocaleKeys =
|
||||
| Exclude<FieldPath<typeof English>, 'name' | 'el'>
|
||||
| (string & NonNullable<unknown>)
|
||||
|
||||
export type TranslatorOption = Record<string, string | number>
|
||||
export type Translator = (path: string, option?: TranslatorOption) => string
|
||||
export type Translator = (path: LocaleKeys, option?: TranslatorOption) => string
|
||||
export type LocaleContext = {
|
||||
locale: Ref<Language>
|
||||
lang: Ref<string>
|
||||
@@ -20,7 +25,7 @@ export const buildTranslator =
|
||||
translate(path, option, unref(locale))
|
||||
|
||||
export const translate = (
|
||||
path: string,
|
||||
path: LocaleKeys,
|
||||
option: undefined | TranslatorOption,
|
||||
locale: Language
|
||||
): string =>
|
||||
|
||||
@@ -13,3 +13,81 @@ export type Nullable<T> = T | null
|
||||
|
||||
export type Arrayable<T> = T | T[]
|
||||
export type Awaitable<T> = Promise<T> | T
|
||||
|
||||
type Primitive = null | undefined | string | number | boolean | symbol | bigint
|
||||
type BrowserNativeObject = Date | FileList | File | Blob | RegExp
|
||||
|
||||
/**
|
||||
* Check whether it is tuple
|
||||
*
|
||||
* 检查是否为元组
|
||||
*
|
||||
* @example
|
||||
* IsTuple<[1, 2, 3]> => true
|
||||
* IsTuple<Array[number]> => false
|
||||
*/
|
||||
type IsTuple<T extends ReadonlyArray<any>> = number extends T['length']
|
||||
? false
|
||||
: true
|
||||
|
||||
/**
|
||||
* Array method key
|
||||
*
|
||||
* 数组方法键
|
||||
*/
|
||||
type ArrayMethodKey = keyof any[]
|
||||
|
||||
/**
|
||||
* Tuple index key
|
||||
*
|
||||
* 元组下标键
|
||||
*
|
||||
* @example
|
||||
* TupleKey<[1, 2, 3]> => '0' | '1' | '2'
|
||||
*/
|
||||
type TupleKey<T extends ReadonlyArray<any>> = Exclude<keyof T, ArrayMethodKey>
|
||||
|
||||
/**
|
||||
* Array index key
|
||||
*
|
||||
* 数组下标键
|
||||
*/
|
||||
type ArrayKey = number
|
||||
|
||||
/**
|
||||
* Helper type for recursively constructing paths through a type
|
||||
*
|
||||
* 用于通过一个类型递归构建路径的辅助类型
|
||||
*/
|
||||
type PathImpl<K extends string | number, V> = V extends
|
||||
| Primitive
|
||||
| BrowserNativeObject
|
||||
? `${K}`
|
||||
: `${K}` | `${K}.${Path<V>}`
|
||||
|
||||
/**
|
||||
* Type which collects all paths through a type
|
||||
*
|
||||
* 通过一个类型收集所有路径的类型
|
||||
*
|
||||
* @see {@link FieldPath}
|
||||
*/
|
||||
type Path<T> = T extends ReadonlyArray<infer V>
|
||||
? IsTuple<T> extends true
|
||||
? {
|
||||
[K in TupleKey<T>]-?: PathImpl<Exclude<K, symbol>, T[K]>
|
||||
}[TupleKey<T>] // tuple
|
||||
: PathImpl<ArrayKey, V> // array
|
||||
: {
|
||||
[K in keyof T]-?: PathImpl<Exclude<K, symbol>, T[K]>
|
||||
}[keyof T] // object
|
||||
|
||||
/**
|
||||
* Type which collects all paths through a type
|
||||
*
|
||||
* 通过一个类型收集所有路径的类型
|
||||
*
|
||||
* @example
|
||||
* FieldPath<{ 1: number; a: number; b: string; c: { d: number; e: string }; f: [{ value: string }]; g: { value: string }[]; h: Date; i: FileList; j: File; k: Blob; l: RegExp }> => '1' | 'a' | 'b' | 'c' | 'f' | 'g' | 'c.d' | 'c.e' | 'f.0' | 'f.0.value' | 'g.number' | 'g.number.value' | 'h' | 'i' | 'j' | 'k' | 'l'
|
||||
*/
|
||||
export type FieldPath<T> = T extends object ? Path<T> : never
|
||||
|
||||
Reference in New Issue
Block a user