You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.4 KiB

7 months ago
import type { CSSProperties, VNodeChild, PropType } from 'vue';
import type { VueTypeValidableDef, VueTypesInterface } from 'vue-types';
import type { RouteComponent, RouteRecordRaw } from 'vue-router';
import { createTypes } from 'vue-types';
type VueNode = VNodeChild | JSX.Element;
const propTypes = createTypes({
func: undefined,
bool: undefined,
string: undefined,
number: undefined,
array: undefined,
object: undefined,
integer: undefined,
});
//
// propTypes.extend([
// {
// name: 'looseBool',
// getter: true,
// type: Boolean,
// default: undefined,
// },
// {
// name: 'style',
// getter: true,
// type: [String, Object],
// default: undefined,
// },
// {
// name: 'VNodeChild',
// getter: true,
// type: undefined,
// },
// ]);
//
//
function withUndefined<T extends { default?: any }>(type: T): T {
type.default = undefined;
return type;
}
const PropTypes = propTypes as VueTypesInterface & {
readonly looseBool: VueTypeValidableDef<boolean>;
readonly style: VueTypeValidableDef<CSSProperties>;
readonly VNodeChild: VueTypeValidableDef<VueNode>;
};
// https://stackoverflow.com/questions/46176165/ways-to-get-string-literal-type-of-array-values-without-enum-overhead
export const tuple = <T extends string[]>(...args: T) => args;
export const tupleNum = <T extends number[]>(...args: T) => args;
/**
* https://stackoverflow.com/a/59187769
* Extract the type of an element of an array/tuple without performing indexing
*/
export type ElementOf<T> = T extends (infer E)[] ? E : T extends readonly (infer F)[] ? F : never;
/**
* https://github.com/Microsoft/TypeScript/issues/29729
*/
export type LiteralUnion<T extends U, U> = T | (U & {});
type DefaultFactory<T> = (props: Data) => T | null | undefined;
export interface PropOptions<T = any, D = T> {
type?: PropType<T> | true | null;
required?: boolean;
default?: D | DefaultFactory<D> | null | undefined | object;
validator?(value: unknown): boolean;
}
interface RouteMeta {
title: string; // 标题
icon?: string; // 图标
requiresAuth?: boolean;
hideChildren?: boolean; // 是否不显示孩子菜单
}
declare type Lazy<T> = () => Promise<T>;
interface NsRouteRecordRaw extends Omit<Omit<RouteRecordRaw, 'children'>, 'meta'> {
name: string;
meta: RouteMeta;
component?: Lazy<RouteComponent>;
children?: NsRouteRecordRaw[];
props?: Recordable;
}
export { VueNode, PropTypes, NsRouteRecordRaw, withUndefined };