Skip to content

Commit

Permalink
fix(tree): 修复类型错误
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangfisher committed Nov 13, 2023
1 parent 961a384 commit d778eed
Show file tree
Hide file tree
Showing 12 changed files with 31 additions and 28 deletions.
2 changes: 1 addition & 1 deletion src/tree/fromPidTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { omit } from "../object/omit"

export function fromPidTree<
FromNode extends PidTreeNode = PidTreeNode,
ToNode extends TreeNode = TreeNode<Omit<FromNode,'pid'>>,
ToNode extends TreeNodeBase = TreeNode<Omit<FromNode,'pid'>>,
IdKey extends string = 'id',
ChildrenKey extends string = 'children'
>(pidNodes:FromNode[],options?:FromPidTreeOptions<FromNode,ToNode,IdKey,ChildrenKey>):ToNode[]{
Expand Down
4 changes: 2 additions & 2 deletions src/tree/getById.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
import { ABORT } from "../object";
import { DefaultTreeOptions } from "./consts";
import { forEachTreeByDfs } from "./forEachTreeByDfs";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";


export interface GetByIdOptions extends TreeNodeOptions{}

export function getById<Node extends TreeNode = TreeNode,IdKey extends string = "id">(treeObj:Node | Node[],nodeId:Node[IdKey],options?:GetByIdOptions):Node | null {
export function getById<Node extends TreeNodeBase = TreeNode,IdKey extends string = "id">(treeObj:Node | Node[],nodeId:Node[IdKey],options?:GetByIdOptions):Node | null {
let result:Node | null = null;
const opts = Object.assign({}, DefaultTreeOptions ,options || {}) as Required<GetByIdOptions>
const { idKey } = opts
Expand Down
4 changes: 2 additions & 2 deletions src/tree/getByPath.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
import { ABORT } from "../object";
import { DefaultTreeOptions } from "./consts";
import { forEachTreeByDfs } from "./forEachTreeByDfs";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";


export interface GetByPathOptions extends TreeNodeOptions{

}

export function getByPath<Node extends TreeNode = TreeNode>(treeObj:Node | Node[],fullpath: string,options?:GetByPathOptions):Node | undefined {
export function getByPath<Node extends TreeNodeBase = TreeNode>(treeObj:Node | Node[],fullpath: string,options?:GetByPathOptions):Node | undefined {
let result:Node | undefined;
let opts = Object.assign({}, DefaultTreeOptions ,options || {}) as Required<GetByPathOptions>
forEachTreeByDfs<Node>(treeObj,({node,path})=>{
Expand Down
6 changes: 2 additions & 4 deletions src/tree/getRelatedTreeNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* 获取指定的节点的关联节点
*/

import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";
import { ABORT } from '../object/forEachObject';
import { getTreeNodeInfo, TreeNodeInfo } from "./getTreeNodeInfo";
import { forEachTreeByDfs } from "./forEachTreeByDfs";
Expand All @@ -17,9 +17,7 @@ export enum RelatedTreeNode{
Previous = 3
}

export function getRelatedTreeNode<Node extends TreeNode = TreeNode,
IdKey extends string = 'id'
>(treeObj: Node | Node[],nodeId:Node[IdKey],pos:RelatedTreeNode , options?:GetRelatedTreeNodeOptions):Node | null {
export function getRelatedTreeNode<Node extends TreeNodeBase = TreeNode,IdKey extends string = 'id'>(treeObj: Node | Node[],nodeId:Node[IdKey],pos:RelatedTreeNode , options?:GetRelatedTreeNodeOptions):Node | null {
const opts = Object.assign({},options) as Required<GetRelatedTreeNodeOptions>
const { idKey } = opts
let result:Node | null | undefined = null
Expand Down
4 changes: 2 additions & 2 deletions src/tree/getTreeNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
import { ABORT } from "../object";
import { DefaultTreeOptions } from "./consts";
import { forEachTreeByDfs } from "./forEachTreeByDfs";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase,TreeNodeOptions } from "./types";


export interface GetTreeNodeOptions extends TreeNodeOptions{
includeParent?:boolean // 当指定时返回[Node,ParantNode]
}

export function getTreeNode<Node extends TreeNode = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId: Node[IdKey],options?:GetTreeNodeOptions):Node | undefined {
export function getTreeNode<Node extends TreeNodeBase = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId: Node[IdKey],options?:GetTreeNodeOptions):Node | undefined {
let result:Node | undefined;
const opts = Object.assign({}, DefaultTreeOptions ,options || {}) as Required<GetTreeNodeOptions>
const { idKey } = opts
Expand Down
4 changes: 2 additions & 2 deletions src/tree/getTreeNodeInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { ABORT } from "../object";
import { DefaultTreeOptions } from "./consts";
import { forEachTreeByDfs } from "./forEachTreeByDfs";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";


export interface GetTreeNodeInfoOptions extends TreeNodeOptions{
Expand All @@ -21,7 +21,7 @@ export interface TreeNodeInfo<Node>{
index:number
}

export function getTreeNodeInfo<Node extends TreeNode = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId: Node[IdKey],options?:GetTreeNodeInfoOptions):TreeNodeInfo<Node> | undefined {
export function getTreeNodeInfo<Node extends TreeNodeBase = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId: Node[IdKey],options?:GetTreeNodeInfoOptions):TreeNodeInfo<Node> | undefined {
let result:TreeNodeInfo<Node> | undefined;
const opts = Object.assign({}, DefaultTreeOptions ,options || {}) as Required<GetTreeNodeInfoOptions>
let { idKey } = opts
Expand Down
4 changes: 2 additions & 2 deletions src/tree/getTreeNodeRelation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

import { DefaultTreeOptions } from "./consts";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";
import { ABORT } from '../object/forEachObject';
import { forEachTreeByDfs } from "./forEachTreeByDfs";

Expand All @@ -24,7 +24,7 @@ export enum TreeNodeRelation{
Unknown = 9 // 未知
}

export function getTreeNodeRelation<Node extends TreeNode = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId:Node[IdKey],refNodeId:Node[IdKey],options?:GetTreeNodeRelationOptions):TreeNodeRelation{
export function getTreeNodeRelation<Node extends TreeNodeBase = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],nodeId:Node[IdKey],refNodeId:Node[IdKey],options?:GetTreeNodeRelationOptions):TreeNodeRelation{
let relation:any = 9;

const opts= Object.assign({}, DefaultTreeOptions ,options || {}) as Required<GetTreeNodeRelationOptions>
Expand Down
8 changes: 4 additions & 4 deletions src/tree/moveTreeNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import { DefaultTreeOptions } from "./consts";
import { getTreeNodeInfo } from "./getTreeNodeInfo";
import { getTreeNodeRelation, TreeNodeRelation } from "./getTreeNodeRelation";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode,TreeNodeBase, TreeNodeOptions } from "./types";


export interface MoveTreeNodeOptions extends TreeNodeOptions{
Expand All @@ -22,7 +22,7 @@ export enum MoveTreeNodePosition{
Previous = 3 // 上一个兄弟
}

export function moveTreeNode<Node extends TreeNode = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],fromNodeId: Node[IdKey],toNodeId:Node[IdKey],pos:MoveTreeNodePosition=MoveTreeNodePosition.LastChild, options?:MoveTreeNodeOptions):void {
export function moveTreeNode<Node extends TreeNodeBase = TreeNode,IdKey extends string = 'id'>(treeObj:Node | Node[],fromNodeId: Node[IdKey],toNodeId:Node[IdKey],pos:MoveTreeNodePosition=MoveTreeNodePosition.LastChild, options?:MoveTreeNodeOptions):void {
const opts = Object.assign({}, DefaultTreeOptions ,options || {}) as Required<MoveTreeNodeOptions>
const { childrenKey } = opts
// 先检查是否允许移动
Expand All @@ -31,8 +31,8 @@ export function moveTreeNode<Node extends TreeNode = TreeNode,IdKey extends stri
throw new Error("Move here is not allowed")
}

let fromNode = getTreeNodeInfo<Node>(treeObj,fromNodeId)
let toNode = getTreeNodeInfo<Node>(treeObj,toNodeId)
let fromNode = getTreeNodeInfo<Node,IdKey>(treeObj,fromNodeId)
let toNode = getTreeNodeInfo<Node,IdKey>(treeObj,toNodeId)

if(!(fromNode && toNode)) {
throw new Error("Unable to read node data")
Expand Down
4 changes: 2 additions & 2 deletions src/tree/removeTreeNodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*
*/

import type { TreeNode, TreeNodeOptions } from "./types";
import type { TreeNodeBase, TreeNode,TreeNodeOptions } from "./types";
import { DefaultTreeOptions } from "./consts";
import { forEachTree, IForEachTreeCallback } from "./forEachTree";
import { ABORT } from "../object";
Expand All @@ -20,7 +20,7 @@ export interface RemoveTreeNodesOptions extends TreeNodeOptions {
onlyRemoveOne?: boolean; // 只删除一个
}

export function removeTreeNodes<Node extends TreeNode>(treeObj:Node | Node[],matcher:IForEachTreeCallback<Node>,options?:RemoveTreeNodesOptions):void{
export function removeTreeNodes<Node extends TreeNodeBase = TreeNode>(treeObj:Node | Node[],matcher:IForEachTreeCallback<Node>,options?:RemoveTreeNodesOptions):void{
const opts= Object.assign({onlyRemoveOne:false}, DefaultTreeOptions ,options || {}) as Required<RemoveTreeNodesOptions>
const {childrenKey='children', idKey='id'} = opts
forEachTree<Node>(treeObj,({node,level,parent,path,index})=>{
Expand Down
6 changes: 4 additions & 2 deletions src/tree/searchTree.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ABORT } from "../object/forEachObject"
import type { ForEachTreeOptions, IForEachTreeCallback } from "./forEachTree"
import { TreeNode,TreeNodeOptions } from "./types"
import { TreeNode,TreeNodeBase,TreeNodeOptions } from "./types"
import { forEachTreeByDfs } from "./forEachTreeByDfs";

export interface SerachTreeOptions extends TreeNodeOptions,ForEachTreeOptions {
Expand All @@ -24,7 +24,7 @@ export interface SerachTreeOptions extends TreeNodeOptions,ForEachTreeOptions {
* @param matchOne 只匹配一个就退出,匹配所有,默认只匹配一个
*
*/
export function searchTree<Node extends TreeNode=TreeNode,Returns=Node[]>(treeData:Node[] | Node,matcher:IForEachTreeCallback<Node>,picker?:IForEachTreeCallback<Node>,options?:SerachTreeOptions):Returns[]{
export function searchTree<Node extends TreeNodeBase=TreeNode,Returns=Node[]>(treeData:Node[] | Node,matcher:IForEachTreeCallback<Node>,picker?:IForEachTreeCallback<Node>,options?:SerachTreeOptions):Returns[]{
let result:Returns[] = []
const pickerFunc = picker || (({node})=>node) as IForEachTreeCallback<Node>
const opts = Object.assign({matchOne:true},options || {})
Expand All @@ -36,3 +36,5 @@ export function searchTree<Node extends TreeNode=TreeNode,Returns=Node[]>(treeDa
},opts)
return result as Returns[]
}


8 changes: 4 additions & 4 deletions src/tree/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@ import { getTreeNodeInfo } from "./getTreeNodeInfo";
import { moveTreeNode, MoveTreeNodePosition } from "./moveTreeNode";
import { removeTreeNodes } from "./removeTreeNodes";
import { searchTree, SerachTreeOptions } from "./searchTree";
import { TreeNode, TreeNodeOptions } from "./types";
import { TreeNode, TreeNodeBase, TreeNodeOptions } from "./types";
import { forEachTreeByDfs } from "./forEachTreeByDfs";

export interface FlexTreeOptions<Node extends TreeNode = TreeNode,IdKey extends string = "id"> extends TreeNodeOptions {
export interface FlexTreeOptions<Node extends TreeNodeBase = TreeNode,IdKey extends string = "id"> extends TreeNodeOptions {
idGenerator(node:Partial<Node>):Node[IdKey]
}

export class FlexTree<Node extends TreeNode = TreeNode,IdKey extends string = "id",ChildrenKey extends string = "children">{
export class FlexTree<Node extends TreeNodeBase = TreeNode,IdKey extends string = "id",ChildrenKey extends string = "children">{
#treeObj:Node[] | Node
#options:FlexTreeOptions<Node,IdKey>
constructor(nodes:Node[] | Node,options?:FlexTreeOptions<Node,IdKey>){
this.#treeObj = nodes
this.#options = Object.assign({},options) as Required<FlexTreeOptions>
this.#options = Object.assign({},options) as Required<FlexTreeOptions<Node,IdKey>>
}
get root(): Node | undefined {
return Array.isArray(this.#treeObj) ? undefined : this.#treeObj
Expand Down
5 changes: 4 additions & 1 deletion src/tree/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export interface TreeNodeOptions{
// y:"a"
// }

// function test<T extends TreeNode = TreeNode>(node:T):T {
// function test<T extends TreeNodeBase = TreeNode>(node:T):T {
// node["x"]=1
// node["children"]=[]
// node["id"]="2"
Expand All @@ -93,3 +93,6 @@ export interface TreeNodeOptions{
// test<TreeNode<{id:'a' | 'b'}>>({id:'a'})
// test<TreeNode<{id:'a' | 'b'}>>({id:'b'})
// test<TreeNode<{id:'a' | 'b'}>>({id:'c'})
// test<TreeNode<{key?:string}>>({id:'c'})
// test<TreeNode<{key:string}>>({id:'c',key:"xxxx"})
// test<TreeNode<{key:string},'key'>>({key:'c'})

0 comments on commit d778eed

Please sign in to comment.