TypeScript 函数中 Promise 返回值类型

WingDust
  • 89
export function fsReadDir(dir:string) { // Promise<unknown>
// export function fsReadDir(dir:string): Promise<Dirent[]> {
    return new Promise((resolve, reject) => {
      fs.readdir(dir, { withFileTypes: true }, (err: any, files: Dirent[]) => {
        if (err) {
          console.log(err);
          reject(err);
        }
        resolve(files);
      });
    }).catch(reason=>{
      // dosome
    });
  }

我想让 函数返回值带有 Promise<Dirent[]>

回复
阅读 96
1 个回答
✓ 已被采纳

直接修改原码

Promise 加类型参数,注意 catch 返回的东西其实也是 resolve,所以返回一个空数组。

import type { Dirent } from "fs";
import fs from "fs";

export function fsReadDir(dir: string): Promise<Dirent[]> { // Promise<unknown>
    // export function fsReadDir(dir:string): Promise<Dirent[]> {
    return new Promise<Dirent[]>((resolve, reject) => {
        fs.readdir(dir, { withFileTypes: true }, (err: any, files: Dirent[]) => {
            if (err) {
                console.log(err);
                reject(err);
            }
            resolve(files);
        });
    }).catch(reason => {
        // dosome
        return [] as Dirent[];
    });
}

如果 Node 版本较新

fs 提供了 promises 接口,版本历史

VersionChanges
v14.0.0Exposed as require('fs/promises').
v11.14.0, v10.17.0This API is no longer experimental.
v10.1.0The API is accessible via require('fs').promises only.
v10.0.0Added in: v10.0.0
import type { Dirent } from "fs";
import fs from "fs";
const fsPromise = fs.promises;

export function fsReadDir(dir: string): Promise<Dirent[]> {
    return fsPromise.readdir(dir, { withFileTypes: true });
}

如果要处理错误

export function fsReadDir(dir: string): Promise<Dirent[]> {
    return fsPromise
        .readdir(dir, { withFileTypes: true })
        .catch(err => []);
}

再补充个 await 的写法(其实前面两段都可以加 async 修饰,不过返回的反正都是 Promise,加不加都无所谓)

export async function fsReadDir(dir: string): Promise<Dirent[]> {
    try {
        return await fsPromise.readdir(dir, { withFileTypes: true })
    } catch (err: unknown) {
        console.log(err);
        return [];
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏