Promise.reject 出现 TypeScript 错误

kel*_*dar 0 javascript arguments promise typescript

为什么我编写的 TypeScript 方法会收到以下编译错误:

getFile(path: string): Promise<FileEntry> {
  return this.file.resolveLocalFilesystemUrl(path)
    .then(entry => {
      if (entry.isFile) {
        return <FileEntry>entry;
      } else {
        let err = new FileError(13);         
        err.message = 'input is not a file';
        return Promise.reject(err);
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Argument of type '(entry: Entry) => Promise<never> | FileEntry' is not assignable to parameter of type '(value: Entry) => PromiseLike<never>'. Type 'Promise<never> | FileEntry' is not assignable to type 'PromiseLike<never>'. Type 'FileEntry' is not assignable to type 'PromiseLike<never>'. Property 'then' is  missing in type 'FileEntry'.
Run Code Online (Sandbox Code Playgroud)

的定义resolveLocalFilesystemUrl如下:

resolveLocalFilesystemUrl(fileUrl: string): Promise<Entry>;
Run Code Online (Sandbox Code Playgroud)

FileEntry是 的子类Entry,因此是强制转换的返回值。然而,错误大约在Promise.reject.

如果我将拒绝行更改为以下内容,它就会起作用:

return Promise.reject<FileEntry>(err);
Run Code Online (Sandbox Code Playgroud)

我需要返回吗Promise.reject(...)?正确的实施方式是什么?

Dan*_*iel 5

要返回承诺,您需要创建一个新的承诺实例并返回该实例。构造函数采用一个函数,该函数接收您在逻辑成功或失败时应该调用的解析和拒绝回调。

为了让你的承诺“返回”你的结果,你不写return result,而是调用resolve(result)

getFile(path: string): Promise<FileEntry> {
  return new Promise<FileEntry>((resolve, reject) => {
    // Your logic here.
    // call resolve() on success
    // or reject() on failure
  });
}
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,它应该如下所示:

getFile(path: string): Promise<FileEntry> {
  return new Promise<FileEntry>((resolve, reject) => {
    this.file.resolveLocalFilesystemUrl(path)
    .then(entry => {
      if (entry.isFile) {
        resolve(<FileEntry>entry); // Success
      } else {
        let err = new FileError(13);         
        err.message = 'input is not a file';
        reject(err); // Error
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关承诺的更多信息,请阅读此处的示例: https: //developers.google.com/web/fundamentals/primers/promises