如何使递归函数类型安全?

问题描述 投票:0回答:1

我有一个组件,用户可以将文件或文件夹拖放到其上,我的代码正在使用该信息执行某些操作。

现在我得到了一个递归方法,它遍历一个文件夹中的文件和其他文件夹,其中也可能有其他包含文件的文件夹等等(我想你明白了)。最后我想拥有用户删除的所有文件。

目前我得到了这个方法:

private traverseDirectory(entry: FileSystemDirectoryEntry): Promise<FileSystemEntry[]> {
    const reader = entry.createReader();
    return new Promise<FileSystemEntry[]>(resolveDirectory => {
      const iterationAttempts: Promise<FileSystemEntry>[] = [];
      const errorHandler = () => {
        logger.error('Error occurred while traversing directory.');
      };

      const readEntries = () => {
        reader.readEntries((batchEntries: FileSystemEntry[]) => {
          if (!batchEntries.length) {
            resolveDirectory(Promise.all(iterationAttempts));
          } else {
            batchEntries.forEach((batchEntry: FileSystemEntry) => {
              if (batchEntry.isDirectory) {
                iterationAttempts.push(
                  this.traverseDirectory(batchEntry as FileSystemDirectoryEntry) as any,
                );
              } else {
                iterationAttempts.push(Promise.resolve(batchEntry));
              }
            });
            readEntries();
          }
        }, errorHandler);
      };
      readEntries();
    });
  }

现在我想去掉 isDirectory() 条件之后的行中的“as any”部分。

我尝试了几个小时想出一些东西,但未能完成,希望得到一些帮助。

非常欢迎任何有关如何使代码更具可读性或更简洁的建议,因为我对 Angular 相当陌生,并且希望提高我的知识。

谢谢你:)

typescript recursion promise
1个回答
0
投票

请注意,您的函数正在返回

Promise<FileSystemEntry[]>
,而您尝试添加此承诺的列表具有不同的类型签名
Promise<FileSystemEntry>[]
,因为类型不同,您必须将其强制转换为 any。调整列表类型。

© www.soinside.com 2019 - 2024. All rights reserved.