feat(projects): useNaiveTable函数:类型部分

This commit is contained in:
Soybean
2022-07-28 00:30:10 +08:00
parent b32bca4984
commit 02992dc02d
5 changed files with 89 additions and 4 deletions

View File

@ -0,0 +1,69 @@
import type { DataTableColumn } from 'naive-ui';
type UnionColumn<T> = T extends DataTableColumn[] ? TypeUtil.ArrayToUnion<T> : never;
type ColumnKey = 'key';
type InterfaceArray = {
[key: string]: unknown;
};
type ColumnKeyData = {
key: unknown;
};
type ExcludeArrayByKey<T extends InterfaceArray[]> = T extends [infer First, ...infer Rest]
? First extends ColumnKeyData
? Rest extends InterfaceArray[]
? [First, ...ExcludeArrayByKey<Rest>]
: [First]
: Rest extends InterfaceArray[]
? ExcludeArrayByKey<Rest>
: []
: [];
type GetUnionColumnKey<T extends InterfaceArray[]> = ColumnKey extends keyof UnionColumn<T>
? UnionColumn<T>[ColumnKey]
: never;
export const columns: DataTableColumn[] = [
{
type: 'selection'
},
{
title: 'Name',
key: 'name',
align: 'center'
},
{
title: 'Age',
key: 'age'
},
{
title: 'Address',
key: 'address'
}
];
export type UnionColumnKey = GetUnionColumnKey<
ExcludeArrayByKey<
[
{
type: 'selection';
},
{
title: 'Name';
key: 'name';
align: 'center';
},
{
title: 'Age';
key: 'age';
},
{
title: 'Address';
key: 'address';
}
]
>
>;

View File

@ -1,7 +1,21 @@
declare namespace TypeUtil {
type Noop = (...args: any) => any;
type UnionInclude<T, K extends keyof T> = K extends keyof T ? true : false;
type GetFunArgs<F extends Noop> = F extends (...args: infer P) => any ? P : never;
type GetFunReturn<F extends Noop> = F extends (...args: any) => infer R ? R : never;
type FirstOfArray<T extends any[]> = T extends [infer First, ...infer _Rest] ? First : never;
type LastOfArray<T extends any[]> = T extends [...infer _Rest, infer Last] ? Last : never;
type ArrayToUnion<T extends any[]> = T extends [infer First, ...infer Rest]
? First extends any
? Rest extends any[]
? FirstOfArray<[First]> | ArrayToUnion<Rest>
: [First]
: never
: never;
}

View File

@ -2,6 +2,6 @@
<div>权限管理</div>
</template>
<script setup lang="ts"></script>
<script setup lang="tsx"></script>
<style scoped></style>

View File

@ -1,5 +1,7 @@
<template>
<div>用户管理</div>
<div>
<n-data-table />
</div>
</template>
<script setup lang="ts"></script>