繁体   English   中英

TypeScript型'承诺<void | object> ' 不可分配给类型 'Promise<object> ' 在 Promise.then()<div id="text_translate"><p> 我目前正在尝试以 base64 格式实现缓存文档的服务。 我希望这个服务从 sessionStorage 中获取文档,如果 sessionStorage 中没有文档,则从 IRequestService 中获取它,然后将其保存到 sessionStorage。 我尝试了这种方法,但出现类型错误</p><pre>Type 'Promise&lt;void | GetDocumentResult&gt;' is not assignable to type 'Promise&lt;GetDocumentResult&gt;'.</pre><p> 代码如下所示:</p><pre> getDocument(requestId: string, documentId: DocumentID, requestService: IRequestService): Promise&lt;GetDocumentResult&gt; { if (this.storageKey in sessionStorage) { const documentsMap: Map&lt;DocumentID, GetDocumentResult&gt; = new Map(JSON.parse(sessionStorage.getItem(this.storageKey).)) if (documentsMap.get(documentId).== undefined) { return new Promise(resolve =&gt; resolve(documentsMap,get(documentId).)) } } return requestService.getDocument(requestId, documentId) .then(value =&gt; {this.setDocument(documentId, value)}) }</pre><p> 我期待 Promise&lt;GetDocumentResult&gt;.then 的返回类型是 Promise&lt;GetDocumentResult&gt;,但由于某种我不明白的原因,它是 Promise&lt;void | 获取文档结果&gt;</p><p> 有人知道为什么会这样吗?</p><p> 谢谢</p></div></object></void>

[英]TypeScript Type 'Promise<void | Object>' is not assignable to type 'Promise<Object>' on Promise.then()

我目前正在尝试以 base64 格式实现缓存文档的服务。 我希望这个服务从 sessionStorage 中获取文档,如果 sessionStorage 中没有文档,则从 IRequestService 中获取它,然后将其保存到 sessionStorage。 我尝试了这种方法,但出现类型错误

Type 'Promise<void | GetDocumentResult>' is not assignable to type 'Promise<GetDocumentResult>'.

代码如下所示:

getDocument(requestId: string, documentId: DocumentID, requestService: IRequestService): Promise<GetDocumentResult> {
    if (this.storageKey in sessionStorage) {
      const documentsMap: Map<DocumentID, GetDocumentResult> = new Map(JSON.parse(sessionStorage.getItem(this.storageKey)!))
      if (documentsMap.get(documentId) !== undefined) {
        return new Promise(resolve => resolve(documentsMap.get(documentId)!))
      }
    }

    return requestService.getDocument(requestId, documentId)
      .then(value => {this.setDocument(documentId, value)})
}

我期待 Promise<GetDocumentResult>.then 的返回类型是 Promise<GetDocumentResult>,但由于某种我不明白的原因,它是 Promise<void | 获取文档结果>

有人知道为什么会这样吗?

谢谢

很可能您遇到了问题,因为您没有在.then()中返回任何内容

这里:

 .then(value => {this.setDocument(documentId, value)})

这使您返回的类型是Promise<void>而不是Promise<GetDocumentResult>

最终版本应该像这里:

getDocument(requestId: string, documentId: DocumentID, requestService: IRequestService): Promise<GetDocumentResult> {
    if (this.storageKey in sessionStorage) {
      const documentsMap: Map<DocumentID, GetDocumentResult> = new Map(JSON.parse(sessionStorage.getItem(this.storageKey)!))
      if (documentsMap.get(documentId) !== undefined) {
        return new Promise(resolve => resolve(documentsMap.get(documentId)!))
      }
    }

    return requestService.getDocument(requestId, documentId)
      .then(value => { return this.setDocument(documentId, value)})
}

如前所述,您的then回调确实返回void而不是结果。 您正在寻找

getDocument(requestId: string, documentId: DocumentID, requestService: IRequestService): Promise<GetDocumentResult> {
  if (this.storageKey in sessionStorage) {
    const documentsMap: Map<DocumentID, GetDocumentResult> = new Map(JSON.parse(sessionStorage.getItem(this.storageKey)!));
    const document = documentsMap.get(documentId);
    if (document !== undefined) {
      return Promise.resolve(document);
    }
  }

  return requestService.getDocument(requestId, documentId).then(value => {
    this.setDocument(documentId, value);
    return value;
//  ^^^^^^^^^^^^
  });
}

顺便说一句,我建议将缓存查找和存储( setDocument ?)提取到单独的服务中,并让该服务将documentsMap保存在 memory 中,而不是每次getDocument时都解析 JSON 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM