我正在try 使用TypeScrip中的类型函数来实现深度优先搜索(DFS)算法.
以下是我的代码:
首先,我定义了最终的DFSRecursive
类型函数所需的所有不同类型的函数,在那里我实现了递归DFS算法.
const MyGraph: Graph = {
A: ["B", "C", "D"],
B: ["F", "E"],
C: ["E", "F"],
D: ["E", "F", "G"],
E: [],
F: [],
G: [],
};
type Graph = {
A: ["B", "C", "D"],
B: ["F", "E"],
C: ["E", "F"],
D: ["E", "F", "G"],
E: [],
F: [],
G: [],
}
export type Concat<T extends string[], U extends string[]> = [...T, ...U];
export type Pop<T extends string[]> = T extends [...infer Rest extends string[], infer Last extends string]
? T extends [infer Last]
? []
: Rest
: never;
export type Append<T extends string[], U extends string> = [...T, U];
export type IsEmpty<T extends string[]> = T extends [] ? true : false;
export type Difference<T extends string[], U extends string[], Result extends string[] = []> =
T extends [infer First extends string, ...infer Rest extends string[]]
? false extends Contains<U, First>
? Difference<Rest, U, Append<Result, First>>
: Difference<Rest, U, Result>
: T extends string[]
? string[]
: Result;
export type Peek<T extends string[]> = T extends [...infer Rest extends string[], infer Last extends string]
? Last
: T extends [infer Last extends string]
? Last
: T extends string[]
? never
: never;
export type Contains<T extends string[], Element extends string> = T extends [infer Head, ...infer Rest extends string[]]
? Head extends Element
? true
: Contains<Rest, Element>
: false;
export type DFSRecursive<Curr extends string, GraphType extends Graph, Stack extends string[], Visited extends string[] = []> =
true extends IsEmpty<Stack>
? Visited
: true extends Contains<Visited, Peek<Stack>>
? DFSRecursive<Peek<Stack>, GraphType, Pop<Stack>, Visited> //Append<Visited, Peek<Stack>>>
: GraphType[keyof Graph & Peek<Stack>] extends infer GT extends string[]
? Difference<GT, Visited> extends infer D extends string[]
? Peek<Stack> extends infer PS extends string
? Append<Visited, PS> extends infer A extends string[]
? Concat<Pop<Stack>, D> extends infer C extends string[]
? DFSRecursive<Peek<Stack>, GraphType, C, A>
: never
: never
: never
: never
: never;
type X = DFSRecursive<"A", Graph, ["A"]>
工作了几个小时后,我意识到有一个错误:
Type instantiation is excessively deep and possibly infinite.
我怎么可能解决这个问题呢?